登录/重启时自动无密码 ssh

登录/重启时自动无密码 ssh

我希望即使在重新启动或注销然后登录后也能保留无密码 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

相关内容