Автоматизируйте передачу файлов scp — между Synology DS и маршрутизатором dd-wrt

Вывод: я хочу настроить сценарий bash для передачи одного файла с Synology DS на маршрутизатор dd-wrt (Netgear WNR3500Lv1).

Проблема: роутер позволяет мне писать только в папку /tmp, которая стирается после перезагрузки. Вместо того, чтобы проверять, перезагрузился ли маршрутизатор, я хотел бы просто каждое утро автоматически отправлять на него файл ("hosts").

Решение, которое не сработало: аналогичный вопрос задавался ранее (Автоматизировать передачу файла scp с помощью сценария оболочки), однако ни один из ответов не работает для меня. В оболочке Synology DS нет обязательных команд: expect, spawn, interact или sshpass. rsync у него есть, а у роутера его нет.

Решение с ключами SSH у меня тоже не работает, потому что я не могу ничего постоянно писать в роутер -> поэтому после перезагрузки настройка пропадает.

Вопрос: есть ли способ добавить необходимые команды в оболочку DS? Или, возможно, более простой способ сделать это - чтобы это могло происходить автоматически без запроса пароля?


person Michal J Figurski    schedule 25.04.2019    source источник
comment
Вопрос в том, как копировать файлы или как автоматизировать это копирование?   -  person Poshi    schedule 25.04.2019
comment
@Poshi - как в заголовке: как автоматизировать копирование   -  person Michal J Figurski    schedule 25.04.2019
comment
Можете ли вы настроить задания cron? Я думаю, что они ваш лучший выбор. Просто запустите команду копирования (или скрипт, который содержит выбранную вами команду копирования) из вашего cron с нужной вам частотой. cron позаботится о его автоматическом запуске, это его работа :-)   -  person Poshi    schedule 25.04.2019
comment
Это XY вопрос. Реальный вопрос заключается в том, как автоматически войти в систему по ssh без использования ожиданий, порождения взаимодействия или sshpass. Дубликат stackoverflow.com/questions/1340366/ ?   -  person KamilCuk    schedule 26.04.2019
comment
Или тогда реальный вопрос заключается в том, как я могу установить что-то на Synology, что вообще не является вопросом программирования, и его легко найти в Google.   -  person tripleee    schedule 26.04.2019
comment
@tripleee - поверьте мне - я пользовался Google. Нет прямых ответов о том, как установить такие вещи на Synology. Я не гуру Linux, и это просто не выполнимо для меня. Другой вариант, который я считаю рекомендуемым в некоторых местах, — это использовать python. Я должен изучить это...   -  person Michal J Figurski    schedule 26.04.2019
comment
@KamilCuk - если я что-то не упустил, на самом деле это не дубликат, потому что проблема не в том, чтобы подключиться к маршрутизатору по ssh, а в том, чтобы скопировать файл.   -  person Michal J Figurski    schedule 26.04.2019
comment
Вы можете скопировать файл, выполнив cat file | ssh user@server sh -c 'cat > outfile'. Да, речь идет о ssh к маршрутизатору, поскольку вы используете scp, который представляет собой протокол, основанный на ssh. Если вы решите проблему автоматизации подключения с помощью ssh, вы можете скопировать свои файлы или даже (смотря на sshfs) использовать для этого rsync.   -  person KamilCuk    schedule 26.04.2019
comment
@KamilCuk К сожалению, это не лучше, чем использование простого scp, потому что он запрашивает пароль...   -  person Michal J Figurski    schedule 26.04.2019
comment
Итак, вопрос, который я связал, считывает пароли со стандартного ввода... вы даже можете написать простой скрипт, который выполняет echo password и передает этот скрипт SSH_ASKPASS=this_script.....   -  person KamilCuk    schedule 26.04.2019


Ответы (1)


Похоже, это невозможно с ограниченным linux bash Synology DSM. Однако оказывается, что scp можно автоматизировать с помощью Python.

Я объединил код из этого вопроса: Как использовать scp в python? со сценарием из этой темы: https://unix.stackexchange.com/questions/276336/automatically-enter-ssh-password-without-using-ssh-key-expect-sshpass-or-p, а затем автоматизировал его с помощью этого руководства: https://forum.synology.com/enu/viewtopic.php?t=141745< /а>

В результате у меня есть следующий скрипт Python:

import os
def run():
    pid, fd = os.forkpty()
    if pid==0:
        os.system('scp "%s" "%s:%s"' % ('myfile.txt', '[email protected]', 'path') )
    while True:
        data = os.read(fd,1024)
        print data
        if "password:" in data:    # ssh prompt
            os.write(fd,"mypassword\n")
        elif "100%" in data:  # upload done
            os.write(fd,"echo hello\n")
            os.write(fd,"echo bye\n")
            os.write(fd,"exit\n")
            os.close(fd)

run()

Это делает работу, однако всегда завершается с OSError: [Errno 9] Bad file descriptor.

person Michal J Figurski    schedule 26.04.2019