Создание графического интерфейса Rsync для резервного копирования на удаленный сервер - PullRequest
4 голосов
/ 01 августа 2011

Итак, я создаю графический интерфейс резервного копирования в Python, который в основном запрашивает у пользователя его имя пользователя / пароль и исходный каталог, чтобы его можно было пересылать на удаленный сервер. Единственная проблема, с которой я сталкиваюсь - это передача пароля (введенного в графическом интерфейсе) серверу после того, как я выполню команду:

rsync -options source_path rsync_user@rsync_server:remote_path

Поскольку я хочу, чтобы пользователь проходил аутентификацию каждый раз, когда он использует графический интерфейс, я не хочу настраивать автоматический сеанс ssh-ключа. Я немного посмотрел на Pexpect и Paramiko, но ожидать, кажется, не очень безопасно, и я не был уверен, как настроить Paramiko, чтобы я мог rsync с локального компьютера на удаленный сервер.

В основном я ищу способ передать пароль серверу (и доверять хосту) после команды rsync без какого-либо взаимодействия с терминалом (цель GUI).

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Прежде всего, это круто, что вы делаете это.Для rsync должно быть много других графических интерфейсов.Я написал Truck - приложение с графическим интерфейсом rsync для Mac - с использованием Python и Qt (PyQt).Я выбрал способ решения этой проблемы - создать локальную пару ключей;сохранить закрытый ключ локально;и добавьте открытый ключ к файлам author_keys удаленного хоста, например:

  PRIV_KEY_PATH = "~/.ssh/private.key"
  if os.path.exists(PRIV_KEY_PATH):
        key = paramiko.RSAKey(filename=PRIV_KEY_PATH)
    else:
        touch(PRIV_KEY_PATH)
        key = paramiko.RSAKey.generate(bits=1024, progress_func=self.keygen_progress)
        key.write_private_key_file(PRIV_KEY_PATH)

    try:
        ftp_cli.chdir(".ssh")
        ftp_cli.chdir("..")
    except IOError:
        ftp_cli.mkdir(".ssh", mode=0o700)

    key_line = "{name} {key} {comment}".format(name=key.get_name(),
                                               key=key.get_base64(),
                                               comment="hello world")
    with ftp_cli.open(".ssh/authorized_keys", mode="a+") as fh:
        fh.seek(0)
        lines = fh.readlines() 
        if not key_line in lines:
            fh.write("\n" + key_line)
        fh.close()

Затем, когда вы вызываете rsync, передайте ему что-то вроде --rsh=ssh -i ~/.ssh/private.key.

В нескольких строках вы настроили пароль SSH без пароля и использовали его для упрощения rsync.Поздравляем с выбором Python.

Поскольку вы говорите, что хотите, чтобы пользователь снова проходил аутентификацию, когда он в следующий раз использует ваш графический интерфейс, вам придется считать это сеансом с временным ключом и соответствующим образом очищать файл авторизованные ключи.Я также создал решение для этого, используя Tkl и Expect, и я бы не рекомендовал этот маршрут.Paramiko безопасен, если вы не обманываете свою реализацию.(P) Expect не является небезопасным по своей природе.

Вы также можете рассмотреть настройку Paramiko в качестве сервера пересылки SSH , но у меня есть опасения по поводу снижения производительности rsync путем ограничения его возможностей через Paramiko.Я думаю, что предпочел бы использовать собственную реализацию SSH машины.

0 голосов
/ 01 августа 2011

Не могли бы вы использовать это?

Для некоторых модулей на удаленном демоне может потребоваться аутентификация.Если это так, вы получите запрос пароля при подключении.Вы можете избежать запроса пароля, установив для переменной среды RSYNC_PASSWORD пароль, который вы хотите использовать, или с помощью --password-file option.Это может быть полезно при создании сценариев rsync.

ПРЕДУПРЕЖДЕНИЕ. В некоторых системах переменные среды видны всем пользователям.В этих системах рекомендуется использовать --password-file.

С rsync(1).

...