Автоматизируйте передачу файлов scp - между Synology DS и маршрутизатором dd-wrt - PullRequest
0 голосов
/ 25 апреля 2019

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

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

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

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

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

1 Ответ

0 голосов
/ 26 апреля 2019

Похоже, что это невозможно с ограниченным ударом Linux 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', 'user@domain.com', '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.

...