我想以某种方式从Fabric库中传递rsync_project()函数(即常规 rsync 命令的包装器)的用户密码。
我发现 rsync 命令的选项--password-file=FILE需要将密码存储在 FILE 中。这可能会起作用,但我正在寻找更好的解决方案,因为我(临时)将密码以纯文本形式存储在数据库中。
请给我任何建议我应该如何使用它。
如果rsync使用ssh作为远程 shell 传输是一个选项,并且您可以为用户设置公钥身份验证,这将为您提供一种安全的方式来执行 rsync,而无需输入密码。
在 Pedro 的回答中使用公钥身份验证是自动使用rsync的理想方式,但是在某些情况下(例如我的),您会被困在使用密码作为连接目标主机的唯一方法。
YMMV,但我的解决方案是通过期望输入密码来实现以下运行rsync的函数:
def run_rsync(source, target, excludes=[]):
excludes = "".join(map(lambda e: " --exclude="+e, excludes))
local("expect -c 'spawn rsync -avz"+excludes+" --force -e \"ssh -oStrictHostKeyChecking=no -p "+env.port+"\" "+source+" "+target+"; expect password; send \""+env.password+"\\n\"; interact'")
请注意,此方法是不安全的,因为在执行命令时密码将输出到 STDOUT,因此仅应作为最后的手段并从受信任的环境中使用。