我正在尝试通过子进程执行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,我正确执行该命令。
感谢。
答案 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
这解决了问题。