【问题标题】:python popen rsync with rsh optionpython popen rsync 与 rsh 选项
【发布时间】:2012-09-11 19:20:28
【问题描述】:

我正在尝试通过 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:执行 ssh -C -p 22 -i /home/bond/.ssh/test 失败:没有这样的文件或目录(2)

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

谢谢。

【问题讨论】:

  • 只是一个提示,与您的问题无关:如果您在~/.ssh/config 中添加一些行,即Host mybackupHostname localhostUser bondPort 22(这是多余的) 、Compression yesIdentityFile /home/bond/.ssh/test,你可以使用['rsync', '-avz', 'mybackup:/home/bond/Bureau', ''/home/bond/data/user/bond/backups/']
  • @mgilson 你的应该是一个答案......
  • @glglgl 感谢您的提示。就我而言,我必须处理许多用户/端口,这就是为什么我更喜欢使用 rsh 选项。
  • @glglgl -- 将其更改为答案。
  • @azerty 啊这样。在这种情况下,用于设置这些的专用界面可能是有意义的。

标签: python rsync popen rsh


【解决方案1】:

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

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

【讨论】:

  • 为了扩展这一点,他的意思是不要引用“ssh -p 22 -i ...”部分。例如,这是我传递给 check_call/Popen 的列表: ["rsync", "--rsh='{}'".format(someVariable), "file" "mark@something.com:/var/www"] 它没有用。为了让它工作,我删除了我插入 --rsh 参数的 {} 周围的引号。所以这有效: ["rsync", "--rsh={}".format(someVariable), "file" "mark@something.com: /var/www"]
【解决方案2】:

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

这解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多