
我发现您可以创建一个 SSH 密钥,以便通过 ssh 使用 rsync,而无需输入密码。
但是我在 Eclipse/ANT 中通过 ssh 使用 rsync,其中可以交互地输入密码,但是 eclipse 和 rsync 命令之间的交互不是交互式的(它是一个命令行 exec 调用),所以我需要在命令行上指定在 eclipse 中获得的密码。
这可能吗?
答案1
在我和电脑之间进行了一场激烈的斗争之后,我终于找到了一个我在任何文章中都找不到的答案。我会发布一篇关于它的博客。
解决方案是使用仅在 ant 1.8.3 的 alpha 版本中修复的新功能,该功能似乎只是对 1.8.2 发行版本的错误修复,因此即使使用 alpha 标题,它也足够稳定。该功能允许您将数据(即密码)传递到脚本的 STDIN。然后,您可以使用标准 Linux 工具或 Windows 上的 cygwin 将密码read
从 STDIN 中取出并将其用作变量。
无依赖关系,没有密钥文件,命令行上没有泄露的密码,没有存储的密码。我终于在过去几天里所遭受的黑暗沉闷的生活之外看到了一些光明。
下面是一个执行此操作的 ANT 任务:
<input message="Enter username for ${website.host}:" addproperty="host.username" />
<input message="Enter password for ${website.host}:" addproperty="host.password" />
<sshexec host="${website.host}" trust="true"
username="${host.username}" password="${host.password}"
inputstring="${host.password}"
command='read var; expect -c "spawn sudo chmod u+x /usr/local/website/bin/start_website" -c "expect ${host.username}:" -c "send ${var}\r" -c "wait"' />
注意命令行:
read var; expect -c "spawn sudo chmod u+x /usr/local/website/bin/start_website" -c "expect ${host.username}:" -c "send ${var}\r" -c "wait"
首先我们read
将 STDIN 放入变量中var
。然后我们启动expect
执行一些需要用户交互的操作:sudo
在本例中。当sudo
提示我们输入密码时,我们从存储的变量中发送密码var
并wait
完成该过程。
答案2
由于您知道这两台机器,因此您可以放心地忽略单个用户的密码,然后:
授予 rsync 用户对 rsync 的 sudo 权限,以便他们可以访问所有内容
使用远程计算机上的 rsync 用户设置私钥/无密码登录,并通过 ssh 使用 sudo 调用 rsync
这样,密码就不再重要了,您会更安全。
答案3
您可以只使用 ssh-agent 和 keychain。