在 Python 3 子进程中尝试 运行 rsync 时出现参数问题
Problem with args when trying to run rsync in Python 3 subprocess
我正在开发备份 python 程序,其中一个模块将远程文件夹的 rsync 备份到我的本地设备。
这是我遇到问题的代码部分:
try:
process = subprocess.Popen(
['sshpass',
'-p',
password,
'rsync',
'-avz',
'-e',
'ssh -o StrictHostKeyChecking=no',
'-p',
port,
'{}@{}:{}'.format(user, host, folder),
dest_folder],
stdout=subprocess.PIPE
)
output = process.communicate()[0]
if int(process.returncode) != 0:
print('Command failed. Return code : {}'.format(process.returncode))
exit(1)
return output
except Exception as e:
print(e)
exit(1)
显示的错误是:
Unexpected remote arg: debian@12.345.67.89:/folder1/folder2/
rsync error: syntax or usage error (code 1) at main.c(1372) [sender=3.1.3]
Command failed. Return code : 1
我认为问题出在 Popen 中的数组。如果我 运行 bash 中的单个命令我 rsync 成功。
我应该从 subprocess.Popen 数组更改什么?
这是由 rsync 而不是 ssh 使用 -p
标志引起的,因此目的地有效设置为 port
。
rsync
的 -e
参数只接受一个参数。这意味着只有 'ssh -o StrictHostKeyChecking=no'
将作为参数传递。不幸的是,-p
是 rsync
的实际标志,因此它的处理没有错误。意思是'preserve permissions'。这意味着您不是将端口设置为与 ssh
一起使用,而是将标志传递给 rsync,并且下一个参数被解释为目标。
您可以通过更改
来修复它
'ssh -o StrictHostKeyChecking=no',
'-p',
port,
简单地
'ssh -o StrictHostKeyChecking=no -p {}'.format(port),
我正在开发备份 python 程序,其中一个模块将远程文件夹的 rsync 备份到我的本地设备。
这是我遇到问题的代码部分:
try:
process = subprocess.Popen(
['sshpass',
'-p',
password,
'rsync',
'-avz',
'-e',
'ssh -o StrictHostKeyChecking=no',
'-p',
port,
'{}@{}:{}'.format(user, host, folder),
dest_folder],
stdout=subprocess.PIPE
)
output = process.communicate()[0]
if int(process.returncode) != 0:
print('Command failed. Return code : {}'.format(process.returncode))
exit(1)
return output
except Exception as e:
print(e)
exit(1)
显示的错误是:
Unexpected remote arg: debian@12.345.67.89:/folder1/folder2/
rsync error: syntax or usage error (code 1) at main.c(1372) [sender=3.1.3]
Command failed. Return code : 1
我认为问题出在 Popen 中的数组。如果我 运行 bash 中的单个命令我 rsync 成功。
我应该从 subprocess.Popen 数组更改什么?
这是由 rsync 而不是 ssh 使用 -p
标志引起的,因此目的地有效设置为 port
。
rsync
的 -e
参数只接受一个参数。这意味着只有 'ssh -o StrictHostKeyChecking=no'
将作为参数传递。不幸的是,-p
是 rsync
的实际标志,因此它的处理没有错误。意思是'preserve permissions'。这意味着您不是将端口设置为与 ssh
一起使用,而是将标志传递给 rsync,并且下一个参数被解释为目标。
您可以通过更改
来修复它 'ssh -o StrictHostKeyChecking=no',
'-p',
port,
简单地
'ssh -o StrictHostKeyChecking=no -p {}'.format(port),