我尝试在通过 ssh 登录到我的服务器时自动执行以下命令:
ssh-agent /bin/bash
ssh-add ~/.ssh/id_rsa
我的 ssh 密钥有一个密码,每次登录时输入一次就可以了。
我尝试将其放入我的 .bashrc 文件中,但我认为 ssh-agent 会启动一个新的 bash 会话。当我在 .bashrc 中写入此文件后尝试登录时,它卡住了,我必须输入“exit”才能看到“输入密码以解锁密钥”提示
还有其他建议吗?
服务器运行的是 Ubuntu LTS
答案1
您可以尝试添加这个:
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa
这样,它就ssh-agent
不会启动新的 shell,而只会在后台启动并输出 shell 命令来设置适当的环境变量。
正如评论中所说,也许你会不是不想在远程主机上运行代理,而是在你正在工作的机器上运行代理,然后使用
ssh -A remote-host
将本地 ssh 代理的服务转发到远程主机。
出于安全原因,您应该只在由可信赖的人员运行的主机上使用代理转发,但这比随时远程运行完整的代理要好。
答案2
另一种方法是将其添加到 .bashrc 中。这与 Erik 的答案具有相同的优势(确保单个实例),但不需要额外的包。
# SSH Agent should be running, once
runcount=$(ps -ef | grep "ssh-agent" | grep -v "grep" | wc -l)
if [ $runcount -eq 0 ]; then
echo Starting SSH Agent
eval $(ssh-agent -s)
fi
如果没有加载至少 1 个密钥,则运行 ssh-add,并将密钥超时设置为 1 天:
ssh-add -l &>/dev/null
if ! [ "$?" == 0 ]; then
echo Adding keys...
ssh-add -t 1d
fi
答案3
另一种方法是使用 Funtoo 的钥匙链.然后你可以将这一行代码粘贴到你的 bash shell 中:
eval $(keychain --eval id_rsa)
它会执行相同的操作(启动 ssh 代理等),但也不会为每个子 shell 运行 ssh-agent 进程。相反,它会查找您拥有的“已在运行”的实例,并将您连接到这些实例。
答案4
另请记住,如果您有 ssh 连接保持活动,则需要先删除现有连接文件才能-A
生效。删除 中的任何 ssh 连接文件/tmp/[host]
。