Проблема с аргументами при попытке запустить rsyn c в подпроцессе Python 3 - PullRequest
0 голосов
/ 07 апреля 2020

Я разрабатываю программу резервного копирования python, один из модулей создает резервную копию удаленной папки rsyn c на моем локальном устройстве.

Это часть кода, в которой у меня есть проблема:

            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 I rsyn c.

Что я должен изменить в массиве subprocess.Popen?

1 Ответ

1 голос
/ 09 апреля 2020

Это вызвано тем, что rsyn c использует флаг -p, а не s sh, и, таким образом, адресат эффективно устанавливается на port.

Аргумент -e rsync принимает ровно один параметр. Это означает, что только 'ssh -o StrictHostKeyChecking=no' будет передано в качестве аргумента. К сожалению, для вас -p - фактический флаг rsync, и поэтому он обрабатывается без ошибок. Это означает «сохранить права доступа» . Это означает, что вместо установки порта для использования с ssh вы передаете флаг rsyn c, а следующий параметр интерпретируется как пункт назначения.

Вы можете исправить это, изменив

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

на просто

 'ssh -o StrictHostKeyChecking=no -p {}'.format(port),
...