0

我正在开发一个备份 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 数组中改变什么?

4

1 回答 1

1

这是-p由 rsync 而不是 ssh 使用的标志引起的,因此目标有效地设置为port.

-e参数rsync只接受一个参数。这意味着 only'ssh -o StrictHostKeyChecking=no'将作为参数传递。不幸的是,-p它是 的实际标志rsync,因此它的处理没有错误。这意味着“保留权限”。这意味着ssh您不是将端口设置为使用 with ,而是将标志传递给 rsync,并且下一个参数被解释为目标。

您可以通过更改来修复它

 'ssh -o StrictHostKeyChecking=no',
 '-p',
 port,

简单地

 'ssh -o StrictHostKeyChecking=no -p {}'.format(port),
于 2020-04-09T06:25:58.243 回答