Python 3.x Python子进程,使用带ssh密钥文件的rsync,方法调用出错
我使用这个命令从远程服务器同步一个数据文件,并使用ssh密钥文件作为身份验证方法。我在bash中的原始命令是:Python 3.x Python子进程,使用带ssh密钥文件的rsync,方法调用出错,python-3.x,ssh,subprocess,rsync,Python 3.x,Ssh,Subprocess,Rsync,我使用这个命令从远程服务器同步一个数据文件,并使用ssh密钥文件作为身份验证方法。我在bash中的原始命令是: rsync -az -e 'ssh -i my_key.pem' admin@192.168.0.10:/export/home/admin/monitor_dir/monitor_srv1.dat . 这很好,它传输文件,但当我尝试使用Python子流程库方法调用时,从这个Python脚本运行bash命令 #!/usr/bin/python import subprocess
rsync -az -e 'ssh -i my_key.pem' admin@192.168.0.10:/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/admin@192.168.0.10:/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]
我也尝试了run和call方法,但我不知道我做错了什么,甚至不知道是否有其他方法使用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
当您从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:link\u stat”/Users/works/LUIS/scripts\u py/admin@...
这可能是另一个错误的副作用。Rsync已决定尝试执行本地->远程复制,而不是远程->本地复制,并尝试解释“admin@...参数作为本地文件名
subprocess.call(['rsync', '-az', '-e', 'ssh -i my_key.pem', ...