5

我正在尝试通过 subprocess & popen 执行 rsync 命令。一切都很好,直到我没有将 rsh 子命令放在出错的地方。

from subprocess import Popen
args = ['-avz', '--rsh="ssh -C -p 22 -i /home/bond/.ssh/test"', 'bond@localhost:/home/bond/Bureau', '/home/bond/data/user/bond/backups/']

p = Popen(['rsync'] + args, shell=False)
print p.wait()

#just printing generated command:
print ' '.join(['rsync']+args)

我试图以多种方式逃避'--rsh="ssh -C -p 22 -i /home/bond/.ssh/test"',但似乎这不是问题。

我收到错误 rsync: Failed to exec ssh -C -p 22 -i /home/bond/.ssh/test: No such file or directory (2)

如果我复制/粘贴当时输出的相同参数,我将正确执行命令。

谢谢。

4

2 回答 2

5

如果你改用会发生什么'--rsh=ssh -C -p 22 -i /home/bond/.ssh/test'(我删除了双引号)。

我怀疑这应该可行。当您将行剪切/粘贴到命令行时会发生什么,您的 shell 会看到双引号并删除它们,但使用它们来防止-C -p等被解释为单独的参数。当您subprocess.Popen使用列表调用时,您已经在没有 shell 帮助的情况下对参数进行了分区,因此您不再需要引号来保留应该拆分参数的位置。

于 2012-09-19T13:47:02.390 回答
0

遇到同样的问题,我用谷歌搜索了这个问题。看来您根本无法使用子进程将参数传递给 ssh。最终,我编写了一个 shell 脚本来运行 rsync 命令,我可以通过 subprocess.call(['rsyncscript', src, dest, sshkey]) 将参数传递给它。shell 脚本是: /usr/bin/rsync -az -e "ssh -i $3" $1 $2

这解决了问题。

于 2016-08-20T16:53:05.823 回答