我想通过SSH执行某个命令,但它不起作用,但其他命令是。怎么来了?



我正在尝试通过SSH执行命令。设置是,我在远程笔记本电脑(机器1(上有我的代码,我想将SSH连接到linux机器(机器2(中,以执行一个命令,将机器2中的所有数据编译成csv文件。

我的代码如下:

import subprocess
ipaddress = "123.45.678.90"
cmd1 = """mysql --batch -u redacted -p"redacted" -h 789.01.234.567 -D redacted -e " SELECT redacted WHERE redacted > '2020-04-13 10:39:42' AND redacted < '2020-04-13 12:46:27' AND redacted AND redacted AND redacted;" > file_name.csv"""
cmd2 = "touch test.txt"
subprocess.Popen("ssh {ip} {cmd}".format(ip=ipaddress, cmd=cmd2), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

在上面的代码中,当我使用cmd2进行测试时,我可以运行代码,然后在机器1的CLI上手动SSH到机器2,并查看文件"test.txt"是在机器2上创建的。

但是,如果我在上面的代码中使用cmd1,然后手动SSH到机器2中,我看不到我想要创建的文件。我可以通过SSH将cmd2的内容手动复制/粘贴到机器2中,它就可以工作了。

有人能帮我弄清楚为什么会这样吗?谢谢

编辑我在子进程.popopen命令中添加了一个错误,当使用cmd1时,打印(错误(消息为:

b"bash: -c: line 0: syntax error near unexpected token `('nbash: -c: line 0: `mysql --batch -u redacted -predacted -h 789.01.234.567 -D redacted -e  SELECT redacted WHERE redacted > '2020-04-13 10:39:42' AND redacted < '2020-04-13 12:46:27' AND redacted AND redacted AND redacted;'n"

在错误打印输出中,命令的所有双引号都被删除,最后的" > file_name.csv也被删除,这就是告诉命令将文件保存到何处的内容。以下是应该发送的原始命令与错误消息返回的内容的并排比较:

origi: mysql --batch -u redacted -p"redacted" -h 789.01.234.567 -D redacted -e " SELECT redacted WHERE redacted > '2020-04-13 10:39:42' AND redacted < '2020-04-13 12:46:27' AND redacted AND redacted AND redacted;" > file_name.csv
error: mysql --batch -u redacted -predacted -h 789.01.234.567 -D redacted -e  SELECT redacted WHERE redacted > '2020-04-13 10:39:42' AND redacted < '2020-04-13 12:46:27' AND redacted AND redacted AND redacted;'n"

如何确保我的原始命令被传递到子流程中。Popen函数?看起来所有的双引号都被剥去了。如果我执行一个简单的打印(cmd1(,它会像往常一样打印出我的命令。感谢

每对相同类型的引号,Python都将其解释为一个单独的字符串。看起来您正试图将cmd1绑定到一堆不同的字符串。

代替:

cmd1 = """mysql --batch -u redacted -p"redacted" -h redacted -D testexec -e " SELECT redacted(over 30 parameters)"

试试这个:

cmd1 = '""mysql --batch -u redacted -p"redacted" -h redacted -D testexec -e " SELECT redacted(over 30 parameters)" > file_name.csv""'

最新更新