我怎么解决这个问题?我有一个 bash 脚本(在 Ubuntu 服务器下),做几个 SSH 连接,执行一些远程传输,比如 rsync 多次。
我的问题是,我想避免多次输入密码。但我不想使用 SSH 公钥交换,因为如果有人拥有密钥,就可以连接远程计算机。
我想要以下内容:
- SSH 应该在我启动 bash 脚本时询问密码
- 重复使用密码,所以在超时之前不要再次询问密码
- 超时后,再次询问密码。
类似的东西,sudo 是如何工作的,只是使用 ssh。
知道如何解决这个问题吗?
编辑1:
我发现了一个名为 ssh 多路复用的新 SSH 功能。也许使用它我可以达到我想要的目标。
https://unix.stackexchange.com/questions/50508/reusing-ssh-session-for-repeated-rsync-commands
这行得通吗?
(根据klor的请求重新发布我的评论作为答案)。
这不是您想听到的,但这就是基于密钥的身份验证的用途。只要您在私钥上加上密码,它就不会比密码验证安全。
您可以使用
ssh-agent
来避免每次都需要输入密码,并且该-t
选项ssh-agent
将为您提供您所追求的超时行为。您的脚本将需要一些逻辑来确定何时发生超时。一种方法是运行
ssh
andrsync
with-o BatchMode=yes
,这将阻止交互式身份验证方法,因此如果密钥不再可用,ssh
将退出而不是提示输入密码。您可以使用退出代码来确定是否需要ssh-add
再次运行;在这种情况下$?
应设置为。255
您仍然需要弄清楚如何将密码提供给
ssh-add
,因为它没有提供以编程方式接受它的方法。除非您的脚本会提示您手动输入,否则您可能需要使用expect
该部分,这意味着在某处对密码进行硬编码。看来我找到了满足我需求的完美解决方案:
为重复的 rsync 命令重用 ssh 会话
此解决方案仅询问一次密码,然后执行 rsync 3 次,而无需再次询问密码。每个 rsync 都使用 SSH 多路复用重用 SSH 连接。
可以更改 SSH 配置,并存储 SSH 多路复用设置,但使用此解决方案无需更改服务器配置,脚本按原样工作。
如果您使用的是密钥文件,则可以使用该
AddKeyToAgent
选项 (OpenSSH>=7.2)。所以你的脚本可能看起来像这样。
将James Sneeringer的评论实现为配置文件脚本。
然后您可以运行该命令
autossh myserver
,如果代理不可用,它将自动初始化代理。别名是为了防止意外调用脚本中的交互函数。有问题的是,在不使用 WM 会话自动启动代理的系统上,这可能会使您的机器充满 ssh-agent 进程,您可能需要
ssh-agent -k
结束它,或者killall ssh-agent
. 如果您想在整个登录会话或多个进程会话中共享单个 ssh-agent,则可能需要一些额外的脚本。我通常会告诉你尝试
expect
,但在这种情况下,我认为使用sshpass 更好,它非常易于安装和使用,我在这里发布一些用例sshpass -p<pass> ssh <args> sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run
玩得开心 :)
编辑 1
在脚本上