Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python子进程,使用带ssh密钥文件的rsync,方法调用出错_Python 3.x_Ssh_Subprocess_Rsync - Fatal编程技术网

Python 3.x Python子进程,使用带ssh密钥文件的rsync,方法调用出错

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

我使用这个命令从远程服务器同步一个数据文件,并使用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

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', ...