Прежде всего, это круто, что вы делаете это.Для 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 машины.