Как мне найти способ использовать SSH и Rsync - PullRequest
0 голосов
/ 08 октября 2018

У меня проблемы с использованием ssh и rsync, включая закрытый ключ в python, включая Popen (подпроцесс).

По сути, синтаксис rsync должен быть следующим:

$ rsync -az -e --log-file=$logdir/logfile.out \
'ssh -e /home/user/.ssh/id_rsa' user@server:/target-directory

ЧтоУ меня есть это:

import subprocess

Сначала я строю свой путь logdir - с переменными:

logdir = [basedir + '/' + 'log' + '/' + today + '/' + 'pfdcopy_' \
+ typ + '_' + ts + '.log.txt']

Затем я строю целевой каталог:

target= ['jboss' + '@' + targetsvr + ':' + /data']

Наконец, я пытаюсь запустить этот код

p1 = subprocess.Popen(['rsync', '-az', '--log-file=%s' % \
logdir/logfile.out , '-e', 'ssh', '-i', \
'/home/user/.ssh/id_rsa', target])

Это довольно сложно, я знаю, в основном из-за переменных и кавычек.

При выполнении этого я всегда получаю разные синтаксические ошибкис p1.

Любая помощь высоко ценится.Спасибо!

отредактировано (08-10-2018):

вот мой полный фрагмент кода работоспособного кода -

from datetime import datetime
import subprocess
import os
import fnmatch

now = datetime.now()
today = now.strftime("%Y-%m-%d")
ts = now.strftime("%Y-%m-%d-%H-%M-%S")
sign_output_dir = '/Users/fanta4/Documents/python-files/outgoing'
mandator = 'BTV'
formsize = 'A4'
basedir = '/Users/fanta4/Documents'
pdf_to_send = []
targetsvr = 'nas1'

doktyp = (
'WPGEBUEHR', 'WPDURCHFU', 'WPABR', 'WPABRKF', 'WPABRVK', 'WPABRTILG', 'WPABRERTR', 'WPAMIS', 'WPSTREP',
'WPABLAUF', 'WPAVISO', 'WPAUSZUG', 'WPERTRAEG', 'WPSIKTEST', 'WPTRANS', 'WPANSCHAFF', 'KKKONTOMIT', 'KRKURSUEW',
'WPVERLUSTA', 'WPVERLUSTG')


os.chdir(sign_output_dir)
for file in os.listdir(sign_output_dir):
    if fnmatch.fnmatch(file, '*.pdf'):
        pdf_to_send.append(file)

os.chdir(sign_output_dir)
print('debug: doktyp ist: {}'.format(formsize))
for typ in doktyp:
    if typ in str(pdf_to_send):
        ts = now.strftime("%Y-%m-%d-%Hh-%Mm-%Ss")
        print('typ: {:12s} exists -> will be transfered to nas1'.format(typ))
        logdir = [basedir + '/' + 'log' + '/' + mandator + '/' + today + '/' + 'pfdcopy_' + typ + '_' + ts + '.log.txt']
        target = ['jboss' + '@' + targetsvr + '/data' + '/' + mandator + typ]
        p1 = subprocess.Popen(
            ['rsync', '-az', '--log-file=%s' % logdir, '-e', 'ssh', '-i', '/Users/fanta4/.ssh/id_rsa', typ, '-l', target])
        p1.returncode
        if p1 > 0:
            print('debug: Error with rsync of typ: {} to target: {}'.format(typ, targetsvr))
        else:
            print('debug: rsync mandator: {:3s} with typ: {:12s} succeeded'.format(mandator, typ))
    else:
        print('debug: typ: {:12s} does not exist'.format(typ))

logfile = ['/data' + '/' + 'log' + '/' + mandator + '/' + ts]
print('debug: pls see logfile in: {}'.format(logfile))

Если я запускаю этот код, я получаю:

/Users/fanta4/anaconda3/bin/python "/Users/fanta4/Library/Mobile Documents/com~apple~CloudDocs/entw/python/prog/rsync-test.py"
Traceback (most recent call last):
/Users/fanta4/Documents/python-files/outgoing
debug: doktyp ist: A4
File "/Users/fanta4/Library/Mobile
Documents/com~apple~CloudDocs/entw/python/prog/rsync-test.py", line 37, in <module>
typ: WPGEBUEHR    exists -> will be transfered to nas1
['rsync', '-az', '--log-file=%s' % logdir, '-e', 'ssh', '-i',   '/Users/fanta4/.ssh/id_rsa', typ, '-l', target])
  File "/Users/fanta4/anaconda3/lib/python3.6/subprocess.py", line 709,   in __init__
restore_signals, start_new_session)
File "/Users/fanta4/anaconda3/lib/python3.6/subprocess.py", line 1275, in _execute_child
restore_signals, start_new_session, preexec_fn)
TypeError: expected str, bytes or os.PathLike object, not list

Process finished with exit code 1

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Ваша проблема иллюстрируется следующими строками (когда они используются для генерации элементов, которые позже используются в качестве элементов внутри вектора аргумента):

logdir = [basedir + '/' + 'log' + '/' + mandator + '/' + today + '/' + 'pfdcopy_' + typ + '_' + ts + '.log.txt']
target = ['jboss' + '@' + targetsvr + '/data' + '/' + mandator + typ]

Вы определяете logdir и target как списки (только с одной строкой внутри них), тогда как они должны быть строками .

Просто снимите квадратные скобки, которые создают список, и вывместо этого есть строки:

logdir = basedir + '/log/' + mandator + '/' + today + '/pfdcopy_' + typ + '_' + ts + '.log.txt'
target = 'jboss@' + targetsvr + '/data/' + mandator + typ
0 голосов
/ 08 октября 2018

Вы не упомянули, какие синтаксические ошибки вы получаете.Для вас было бы действительно полезно включить эту информацию.Я предполагаю, что он пропускает пропущенные кавычки вокруг одного параметра строки.

p1 = subprocess.Popen([
    'rsync', '-az', '--log-file=%s' % 'logdir/logfile.out',
    '-e', 'ssh', '-i',
    '/home/user/.ssh/id_rsa', target
])
...