python popen rsync with rsh选项

时间:2012-09-19 13:12:47

标签: python rsync popen rsh

我正在尝试通过子进程执行rsync命令& POPEN。一切都没问题,直到我没有把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:无法执行ssh -C -p 22 -i /home/bond/.ssh/test:没有这样的文件或目录(2)

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

感谢。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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

这解决了问题。