SSH询问密码一次,重复使用密码直到超时完成

klo*_*lor 3 ssh password timeout

我怎么解决这个问题?我有一个 bash 脚本(在 Ubuntu Server 下),执行多个 SSH 连接,执行一些远程传输,例如 rsync 多次。

我的问题是,我想避免多次输入密码。但是我不想使用SSH公钥交换,因为如果有人拥有密钥,就可以连接远程计算机。

我想要以下内容:

  • 当我启动 bash 脚本时 SSH 应该询问密码
  • 重用密码,所以在超时之前不要再次询问密码
  • 超时结束后,再次询问密码。

类似的东西,sudo 是如何工作的,只是使用 ssh。

知道如何解决这个问题吗?

编辑1:

我发现了一个名为 ssh 多路复用的新 SSH 功能。也许使用这个我可以达到我想要的目标。

https://unix.stackexchange.com/questions/50508/reusing-ssh-session-for-repeated-rsync-commands

这行得通吗?

Jam*_*ger 5

(转贴从每个请求的答案我的评论klor)。

这不是您想听到的,但这正是基于密钥的身份验证的用途。只要你在你的私钥上加上密码,它的安全性不亚于密码认证。

您可以使用ssh-agent以避免每次都需要输入密码,并且该-t选项ssh-agent将为您提供您所追求的超时行为。

# start a shell under ssh-agent with a 5-minute timeout for keys loaded with ssh-add
ssh-agent -t 300 /bin/bash

# add your key(s) to the agent; ssh-add will prompt for passphrase, if one is set
ssh-add

# do some stuff
ssh remote.server cat /some/file
rsync file1 file2 klor@remote.server:/some/directory

# after 300 seconds, timeout reached, run ssh-add again to re-add your keys
ssh-add
Run Code Online (Sandbox Code Playgroud)

您的脚本将需要一些逻辑来确定超时发生的时间。一种方法是运行sshrsyncwith -o BatchMode=yes,这将阻止交互式身份验证方法,因此如果密钥不再可用,ssh将退出而不是提示输入密码。您可以使用退出代码来确定是否需要ssh-add再次运行;在这种情况下$?应该设置为255

您仍然需要弄清楚如何将密码提供给ssh-add,因为它没有提供以编程方式接受它的方法。除非您的脚本会提示您手动输入它,否则您可能需要在expect该部分使用它,这意味着在某处对密码进行硬编码。