所以我在Python中创建一个备份GUI,它基本上要求用户输入他们的用户名/密码和源目录,以便可以将其发送到远程服务器。我遇到的唯一麻烦就是在执行命令后将密码(在GUI中输入)传递给服务器:
rsync -options source_path rsync_user@rsync_server:remote_path
由于我希望用户每次使用GUI时都进行身份验证,因此我不想设置自动ssh密钥会话。我看了一下Pexpect和Paramiko,但期望看起来不太安全,我不知道如何配置Paramiko,所以我可以从本地计算机rsync到远程服务器。
基本上我正在寻找一种方法来在rsync命令之后将密码传递给服务器(并信任主机),而不需要任何类型的终端交互(GUI的目的)。
答案 0 :(得分:0)
你能用吗?
远程守护程序上的某些模块可能需要身份验证。如果 因此,连接时您将收到密码提示。你可以避免 通过设置环境变量来提示密码
RSYNC_PASSWORD
到您要使用或使用的密码--password-file option
。在编写rsync脚本时,这可能很有用。警告:在某些系统环境中,所有人都可以看到变量 用户。在那些使用
--password-file
的系统上建议。
来自rsync(1)
。
答案 1 :(得分:0)
首先,您正在执行此操作很棒。 rsync应该有更多的GUI。我已经使用Python和Qt(PyQt)编写了Truck-an rsync GUI app for Mac。我选择的解决此问题的方法是生成本地密钥对。在本地保存私钥;并将公用密钥附加到远程主机的authorized_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。
就像您说的那样,当用户下次使用GUI时,希望用户再次进行身份验证时,必须将其视为一个临时的密钥会话,并适当地清理authorized_keys文件。我还使用Tkl和Expect构建了对此的解决方案,并且我不建议您使用该路线。除非您对实现不满意,否则Paramiko是安全的。 (P)期望并不是天生的不安全感。
您可能还会考虑setting up Paramiko as an SSH forwarding server,但我担心通过Paramiko限制rsync的性能来抑制它的性能。我想我更喜欢使用计算机的本地SSH实现。