为什么是subprocess.call(“”“scp foo”“)坏了吗?

2024-05-28 20:47:08 发布

您现在位置:Python中文网/ 问答频道 /正文

成功:

>>> scp_cmd = r"sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/"
>>> subprocess.call(scp_cmd, shell=True)
1eadmin1.conf                                                  100%   83KB  83.5KB/s   00:00
1stflr_1.conf                                                  100% 2904     2.8KB/s   00:00
>>> scp_cmd = """sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/"""
>>> os.system(scp_cmd)
1eadmin1.conf                                                  100%   83KB  87.3KB/s   00:00
1stflr_1.conf                                                  100% 2904     3.4KB/s   00:00

失败:

^{pr2}$

我很困惑,为什么我使用subprocess.call()时三重引号失败,而当我使用os.system()时却失败了。在处理三重引号字符串时,subprocess.call()和{}之间为什么有区别?在


Tags: cmdidhomekbconfsudocallrsa
2条回答

马蒂恩说的每件事都是+1,我想我可能知道发生了什么。此输出:

>>> subprocess.call(scp_cmd.split(' '))
/opt/backups/\*conf: No such file or directory

我觉得很可疑。为什么会有反斜杠?

尽我所能匹配你的命令,我得到了类似[仅抑制用户名]:

^{pr2}$

因为正如所解释的,它们是同一个字符串。但如果你不小心在里面加了反斜杠?你会得到

>>> subprocess.call(r"""scp -i /home/user/.ssh/id_rsa /tmp/\*conf user@localhost:/tmp/save""", shell=True)
/tmp/*conf: No such file or directory
1
>>> subprocess.call(r"""scp -i /home/user/.ssh/id_rsa /tmp/\*conf user@localhost:/tmp/save""".split(" "))
/tmp/\*conf: No such file or directory
1
>>> subprocess.call(shlex.split(r"""scp -i /home/user/.ssh/id_rsa /tmp/\*conf user@localhost:/tmp/save"""))
/tmp/*conf: No such file or directory
1

它与您的输出完全匹配shell=Trueshlex.split()的输出中没有反斜杠,但是.split(" ")有反斜杠。为了进行比较,如果没有反斜杠,则应该得到错误消息

>>> subprocess.call(r"""scp -i /home/user/.ssh/id_rsa /tmp/*conf user@localhost:/tmp/save""".split(" "))
/tmp/*conf: No such file or directory
1

所以在我看来,您发布的scp_cmd并不是您的输出实际对应的那个,而且您真正的输出有一个反斜杠。在

我很肯定你在做其他不同的事情;三重引用在这里根本没有什么不同:

>>> a = r"sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/"
>>> b = r"""sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/"""
>>> a == b
True
>>> b
'sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/'
>>> a
'sudo scp -i /home/backup/.ssh/id_rsa /opt/backups/*conf backup@a-hostname.local:/opt/backups/'

使用三重引号只是指定python字符串文本的一种方法。指定该文本(带或不带r原始前缀、单引号或三引号、使用单'或双"引号)的方式不会保留。在

三重引号的作用是当你加入一行新行时:

^{pr2}$

但您的示例中根本不包含任何换行符。在

相关问题 更多 >

    热门问题