我正在尝试通过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""'