我已经有了此命令来同步来自远程服务器的数据文件,并且我正在使用ssh密钥文件作为身份验证方法。我在bash中的原始命令是:

rsync -az -e 'ssh -i my_key.pem' [email protected]:/export/home/admin/monitor_dir/monitor_srv1.dat .

而且效果很好,它可以传输文件,但是当我尝试使用Python子进程库方法调用时,可以从该python脚本运行bash命令。
#!/usr/bin/python
import subprocess

server = ['192.168.0.10', '/export/home/admin/monitor_dir/', 'srv1']

subprocess.call(['rsync', '-az', '-e', '\'ssh', '-i', 'my_key.pem\'', 'admin@{0}:{1}monitor_{2}.dat'.format(server[0],server[1],server[2]), '.'])

这是显示的错误:
rsync: link_stat "/Users/works/LUIS/scripts_py/my_key.pem'" failed: No such file or directory (2)

rsync: link_stat "/Users/works/LUIS/scripts_py/[email protected]:/export/home/admin/monitor_dir/monitor_srv1.dat" failed: No such file or directory (2)

rsync error: some files could not be transferred (code 23) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-51/rsync/main.c(996) [sender=2.6.9]

我也尝试过运行并调用方法,但是我不知道自己在做什么错,或者即使有另一种方法可以使用python执行rsync命令?

我正在使用:
-Python 3.5.0
-GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
-rsync  version 2.6.9  protocol version 29

最佳答案

rsync -az -e 'ssh -i my_key.pem' ...

从 shell 程序运行rsync时,单引号是 shell 程序语法,将字符串ssh -i my_key.pem视为单个命令行参数,而不是由空格分隔的三个参数。当您的shell调用rsync程序时,rsync将具有以下命令行参数列表:
rsync
-az
-e
ssh -i my_key.pem
...

在python版本中:
subprocess.call(['rsync', '-az', '-e', '\'ssh', '-i', 'my_key.pem\'', ...

您正在将这些命令行参数传递给rsync:
rsync
-az
-e
'ssh
-i
my_key.pem'

您在这里不需要转义的引号-原始引号是shell语法,并且您没有在这里使用shell来调用rsync。您想像这样调用rsync:
subprocess.call(['rsync', '-az', '-e', 'ssh -i my_key.pem', ...

至于这个错误:



这可能是另一个错误的副作用。 Rsync已决定尝试执行本地->远程副本而不是远程->本地副本,并且尝试将“admin @ ...”参数解释为本地文件名。

关于python-3.x - Python子进程,将rsync与ssh key 文件一起使用,方法Call出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59056169/

10-15 14:07