![登录/重启时自动无密码 ssh](https://linux22.com/image/1495/%E7%99%BB%E5%BD%95%2F%E9%87%8D%E5%90%AF%E6%97%B6%E8%87%AA%E5%8A%A8%E6%97%A0%E5%AF%86%E7%A0%81%20ssh.png)
我希望即使在重新启动或注销然后登录后也能保留无密码 ssh。不知何故,我必须运行 ssh-agent 并在登录时使用命令 ssh-add 。在教程中,我读到我应该将以下行添加到.bashrc
:
ssh_agent="$HOME/.ssh-agent.sh"
if [ -f $ssh_agent ]
then
source $ssh_agent > /dev/null
fi
同时,教程中提到
当 ssh-agent 正在运行您的所有进程(包括您的 cron 作业)时,不需要密码。然而,如果 ssh-agent 死亡或被杀死,事情可能会出错,因为旧的设置被保留下来。
我想要一种安全的方法,即使在重新启动/重新登录后,它也允许我在没有密码的情况下使用 ssh。有什么建议么?
答案1
最简单的方法:安装pam_ssh
。当您登录时,它会自动启动 ssh-agent 并加载您的密钥。
困难的方法:将其放入您的登录脚本(~/.bash_profile
或~/.profile
)中:
check-ssh-agent() {
# `ssh-add` returns 2 if the agent is running but empty; ignore.
ssh-add -l &>/dev/null || (( $? == 2 ))
}
if ! check-ssh-agent; then
envfile=~/.ssh/agent-$HOSTNAME
if [ -f "$envfile" ]; then
. "$envfile" >/dev/null
fi
if ! check-ssh-agent; then
ssh-agent >"$envfile"
. "$envfile" >/dev/null
if [ -t 0 ]; then
# This `if` can be removed if all your keys are passphrase-less.
ssh-add
fi
fi
unset envfile
fi
“剩余设置”只是$SSH_AUTH_SOCK
环境变量,您可以轻松修复。 (此外,这一切可以go error 是来自 ssh 的错误消息。)
答案2
只需使用固定的代理套接字即可。例如:
export SSH_AUTH_SOCK=/tmp/user.agent
ssh-agent -a /tmp/user.agent
ssh-add
ssh -f -N -R 22:localhost:2222 server
它开始ssh-agent
使用套接字/tmp/user.agent
,然后运行ssh-add
以将私钥加载到其中。然后我开始ssh
使用远程端口转发来连接服务器。尝试连接到服务器上的端口 2222 将被转发回客户端并连接到客户端上的端口 22。 -N 表示不启动 shell,-f 表示 fork 并在后台运行。我使用这种命令使我的桌面可以从服务器访问,而无需在路由器上打开端口。稍后当您再次登录时,代理仍将运行。只需重置代理套接字export SSH_AUTH_SOCK=/tmp/user.agent
即可再次运行 ssh。仅在 ssh-agent 首次启动后才需要 ssh-add。
答案3
和钥匙链只要使用没有密码的密钥对就可以做到。它是一个简单的shell脚本包装ssh-agent,因此不需要安装任何额外的软件。
它会自动检测您是否正在运行 ssh 代理并使用它们。您可以将其配置为自动加载一组密钥并在某些情况下忘记它们。
非常适合处理需要 SSH 访问不同机器的 cronjobs。您只需要文件source
中的正确文件~/.keychain
,cronjob 将能够使用您设置的任何密钥。
笔记:即使您注销,这也会起作用,但如果您重新启动系统或终止代理,则不会。现在有一种方法可以在代理死亡时保持密钥打开,除非您将密码存储在文件中。显然,这将破坏密码保护密钥的全部目的。
答案4
您可以使用ssh-copy-id
将公钥复制到远程计算机。如果您在执行 时没有添加密码ssh-keygen
,那么每当您 ssh 到该远程计算机时,它都不会提示您输入密码。
所以步骤将是这样的:
local$ ssh-keygen -t dsa
local$ ssh-copy-id remote
local$ ssh remote