我正在尝试通过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,并看到在计算机2上创建了文件“ test.txt”。
但是,如果我在上面的代码中使用cmd1,则我手动SSH进入了计算机2,但没有看到要创建的文件。我可以SSH到计算机2中,并手动将cmd2的内容复制/粘贴到其中,并且可以正常工作。
有人可以帮我找出原因吗?谢谢!
Edit我在subprocess.popopen命令中添加了一个err,使用cmd1时,print(err)消息为:
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
也被去除,这告诉了命令该文件的保存位置。这是对应该发送的原始命令以及err msg所返回内容的并行比较:
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"
如何确保将原始命令传递到subprocess.Popen函数中?看起来所有双引号都被删除了。如果我执行简单的print(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""'