通过SSH登录时直接运行ssh-agent和ssh-add的直接方法?


37

我试图通过ssh登录到服务器时自动执行以下命令:

ssh-agent /bin/bash
ssh-add ~/.ssh/id_rsa

我的ssh密钥有一个密码短语,每次登录可输入一次即可。

我尝试将其放入我的.bashrc文件中,但是我相信ssh-agent会启动一个新的bash会话。当我将其保存在.bashrc中后尝试登录时,它被卡住了,我必须输入“ exit”才能看到“输入密码以解锁密钥”提示

还有其他建议吗?

服务器正在运行Ubuntu LTS


为什么在服务器上使用密钥代理?它应该在您要从其连接的本地客户端上。
Zoredache'3

我想git pull在远程服务器上执行
@Zoredache等操作

然后在本地计算机上运行SSH代理,并转发该代理。
Zoredache'3

@Zoredache谢谢,不知道那是可能的。但是,我仍然希望能够从bash脚本(甚至从本地计算机)中执行ssh-add / ssh-agent。必须手动运行这些命令很痛苦。
点击Upvote

Answers:


51

您可以尝试添加以下内容:

eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa

这样,ssh-agent它不会启动新的Shell,它只是在后台启动自身,并吐出Shell命令来设置适当的环境变量。

正如评论说,也许你希望在所有远程主机上运行的代理,而是在包装盒上您工作和使用

ssh -A remote-host

将本地ssh代理的服务转发到远程主机。

出于安全原因,您仅应将代理转发与可信任人员运行的主机一起使用,但这比随时远程运行完整的代理要好。


当我替换ssh-agent /bin/bashssh-agent -s,然后尝试执行时git pull,仍然会要求输入私钥的密码来解锁它。那不是我真正想要的,我只需要在执行ssh-add时输入密码,而不必每次运行任何git命令时都重复一次。有任何想法吗?
点击Upvote

并在本地运行代理并使用ssh -A不是您的选择吗?问题是,您不能在每个连接上“重新启动” ssh-agent。每次启动它时,它什么都不知道,并且在ssh-add密钥时,您将不得不对其解密...
Tobi Oetiker

为您的.ssh / config文件:主机远程主机ControlMaster自动ControlPath ~/.ssh/master-%l-%r@%h:%p ControlPersist 2h
Tobi

1
哎呀,刚刚在bash中意识到,您需要在ssh-agent呼叫之前进行额外评估。.更新了我的上述答案
Tobi Oetiker 2015年

1
您可以创建一个别名
Tobi Oetiker 2015年

2

一种替代方法是使用Funtoo的钥匙串。然后,您可以将此单线粘在bash外壳中:

eval $(keychain --eval id_rsa)

这样做是一样的(启动ssh代理等),同时也不为每个子shell运行ssh-agent进程。相反,它将查找您拥有的“已经运行”的实例,并将您附加到这些实例上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.