ssh转发代理:sshagent使用详解

使用ssh-agent之前使用ssh公钥认证的方式可以免去ssh客户端(如ssh命令、xshell等)连接远端主机sshd时需要输入对方用户密码的问题。但如果执

大家好,关于ssh转发代理:sshagent使用详解很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!

但是,如果执行ssh命令的主机上保存了多组密钥,并且将每组公钥分发到不同的远程主机上,那么即使使用公钥认证,仍然需要输入密码,因为ssh客户端不知道要读取哪个私钥来与远程主机上的公钥相匹配。

看下图描述的情况:

上面描述的情况是这样的:ssh客户端需要管理web服务器组和mysql服务器组,并且ssh客户端需要为这两个组中的主机使用不同的密钥对。例如,要连接到Web 服务器组中的主机,请使用密钥集~/.ssh/id_rsa_1。要连接到mysql 服务器组中的主机,请使用密钥集~/.ssh/id_rsa_2。

因此,id_rsa_1.pub被分发到web服务器组中的每个主机,id_rsa_2.pub被分发到mysql服务器组中的每个主机:

123456$ ssh-copy-id -i ~/.ssh/id_rsa_1.pub root@webserver1$ ssh-copy-id -i ~/.ssh/id_rsa_1.pub root@webserver2$ ssh-copy-id -i ~/. ssh/id_rsa_1.pub root@webserver3$ ssh-copy-id -i ~/.ssh/id_rsa_2.pub root@mysqlserver1$ ssh-copy-id -i ~/.ssh/id_rsa_2.pub root@mysqlserver2$ ssh-copy -id -i ~/.ssh/id_rsa_2.pub root@mysqlserver3 这一切都很顺利,但是一连接,我发现仍然需要密码:

12345$ ssh root@webserver1 快速输入root@webserver的密码: $ ssh root@mysqlserver1 快速输入root@mysqlserver的密码:这是因为当ssh客户端连接到webserver1时,除了默认会读取的标准私钥文件id_rsa(或其他密钥类型)之外,它不会自动读取任何文件。连接mysqlserver1也是如此。

正确的连接方式是在连接时指定使用哪个私钥进行配对:

12$ ssh -i ~/.ssh/id_rsa_1 root@webserver1$ ssh -i ~/.ssh/id_rsa_2 root@mysqlserver1 太高兴了,终于连接上了。但这很恶心,而且你必须指定连接私钥。

不仅如此,如果私钥是加密的(passphrase),则在指定私钥时必须输入passphrase密码。

ssh-agent 是做什么的?

ssh转发代理:sshagent使用详解

程序员对这种连接方式非常不满意,于是他创建了一个中间私钥管理器ssh-agent:难道你不知道如何配对吗?我会帮你做的。而且这个功能对于程序员来说太简单了。

我在ssh身份认证阶段解释过,ssh认证过程其实就是客户端(ssh命令端)读取自己的私钥并推导出指纹并发送给服务器(sshd端)。服务器还使用自己保存的公钥。比较密钥派生指纹。如果指纹相同,则说明服务器的公钥和客户端的私钥是匹配的。以下是公钥和私钥的指纹计算方法:

1234$ ssh-keygen -l -f ~/.ssh/id_rsa_22048 2c:e9:70:a8:f5:8d:87:9f:8c:de:cf:cf:14:f4 :40:52 root@xuexi.longshuai.com (RSA)$ ssh-keygen -l -f ~/.ssh/id_rsa_2.pub 2048 2c:e9:70:a8:f5:8d:87:9f:8c3336 0de:cf:cf:14:f4:40:52 root@xuexi.龙帅。 com(RSA)密钥认证过程是理解ssh-agent的关键。

ssh-agent的主要功能大致描述如下:

使用ssh-agent 和ssh-add

首先运行ssh-agent:

分段阅读_第1234 章导出SSH_AUTH_SOCK;SSH_AGENT_PID=28162;导出SSH_AGENT_PID;回显代理pid 28162;输出清楚地表明了几个环境变量已经导出,并且还可以知道ssh -agent 使用Unix Domain 套接字在本机上监听,其pid 为28162,此时可以直接使用kill 28162 杀死该进程。更直接的方法是使用ssh-agent -k,它会根据当前环境变量SSH_AGENT_PID 杀死进程。

不幸的是,上面的ssh-agent虽然运行成功,但是两个环境变量并没有导出,上面的结果只显示给用户。所以更多时候是使用eval来执行ssh-agent,这样这些环境变量也被导出:

12345# 先杀死ssh-agent$kill 28162$ eval `ssh-agent`Agent pid 28173 在ssh 客户端运行ssh-agent 后,可以使用ssh-add 命令将私钥添加到ssh-agent(如果私钥(如果使用passhprase密码,则需要输入密码一次)。

123$ ssh-add$ ssh-add ~/.ssh/id_rsa_1$ ssh-add ~/.ssh/id_rsa_2 默认会添加~/.ssh/下的所有私钥文件(~/.ssh/id_rsa,ssh/id_dsa、~/.ssh/id_ecdsa、~/.ssh/id_ed25519、~/.ssh/identity),也可以指定要添加的文件。正如上面给出的例子。

ssh转发代理:sshagent使用详解

ssh-add命令查找当前环境变量SSH_AUTH_SOCK的值并向对应的socket发送add请求,所以这个socket环境变量非常重要。

然后使用公钥认证直接连接目标主机:

1234567$ ssh root@webserver1$ ssh root@webserver2$ ssh root@webserver3$ ssh root@mysqlserver1$ ssh root@mysqlserver2$ ssh root@mysqlserver3 ssh-agent的痛点及解决方案

ssh-agent 的工作取决于环境变量SSH_AUTH_SOCK 和SSH_AGENT_PID。只要没有ssh-agent与这两个环境变量配对,不同用户、不同终端将无法使用agent进程。如果要使用代理,必须首先在自己的shell 中设置这两个环境变量。

另外,需要注意的是,以eval `ssh-agent` 启动会直接让ssh-agent 在后台工作。它将成为自己的进程组。其父进程或终端退出后,仍会锚定在init/systemd下的pid=1。 ssh-agent 的工作取决于环境变量SSH_AUTH_SOCK 和SSH_AGENT_PID。这两个环境变量在shell 或终端退出后消失,使得之前运行的ssh-agent 冗余地保留在后台。

其实我们可以根据已有的ssh-agent自行推导这两个环境变量。如果ssh-agent进程还存在,则/tmp/目录下一定有对应的socket文件(除非启动ssh-agent时自定义了socket路径)。

12345$ tree /tmp/ssh* /tmp/ssh-q3tM0FzpCcdUagent.28629/tmp/ssh-SkKrrkK6qLDqagent.28817 这样就已经获取了环境变量SSH_AUTH_SOCK的值。然后根据agent.ppid中的ppid值,加1,就是其子进程ssh-agent进程的PID值。例如,如果要使用上面agent.28629对应的ssh-agent,则设置:

12export SSH_AUTH_SOCK=/tmp/ssh-q3tM0FzpCcdU/agent.28629export SSH_AGENT_PID=28630 我们可以自己写一个脚本来自动获取和设置这些环境变量。

不过,有人已经使用shell 脚本提供了更完整的解决方案:https://github.com/wwalker/ssh-find-agent。

下载ssh-find-agent.sh脚本并将其放在某个目录中。比如直接放在/etc/profile.d目录下,然后赋予执行权限:

ssh转发代理:sshagent使用详解

12$ wget https://raw.githubusercontent.com/wwalker/ssh-find-agent/master/ssh-find-agent.sh -O /etc/profile.d/ssh-find-agent.sh$ chmod +x /etc/profile .d/ssh-find-agent.sh 之后,只需在新终端或与ssh-agent 进程失去联系的shell 中执行即可(如果是在旧终端上,则需要先获取shell 脚本) ):

$ ssh-find-agent -a 会自动查找第一个ssh-agent进程并配置相关环境变量:

12345$ ssh-find-agent -a$ echo $SSH_AUTH_SOCK/tmp/ssh-SkKrrkK6qLDq/agent.28817$ echo $SSH_AGENT_PID28818 不给出任何参数的ssh-find-agent 函数会列出当前可以找到的ssh-agent 进程相关环境变量和数字。

123$ ssh-find-agentexport SSH_AUTH_SOCK=/tmp/ssh-q3tM0FzpCcdU/agent.28629 #1) export SSH_AUTH_SOCK=/tmp/ssh-SkKrrkK6qLDq/agent.28817 #2) 使用ssh-find-agent 的-c 选项手动选择要使用的ssh-agent 进程。

如果你不知道当前是否有ssh-agent,可以使用以下方法:

$ ssh-find-agent -a || eval $(ssh-agent) /dev/null 这会在找不到ssh-agent 时自动打开它。

在ssh-agent 中管理私钥

ssh-agent 命令的选项:

123456789101112131415-a bind_address 指定运行时绑定到ssh-agent 的Unix 域套接字路径。默认是`$TMPDIR/ssh-xxx/agent.ppid` -c -s 指定ssh-agent运行时输出的内容(那些环境变量) 是csh还是bash格式的语句-d 调试模式-k 杀掉pid `SSH_AGENT_PID`环境变量指定的进程-t life 指定ssh-agent 中私钥(指纹)的有效期。默认单位是秒,可以指定m(分钟)、h(小时)、d(天)、w(周)。如果不指定,则永久有效。有效期可以被ssh-add 指定的有效期选项和ssh-add 命令的选项(部分选项)覆盖:

用户评论

ssh转发代理:sshagent使用详解
哭着哭着就萌了°

终于找到了讲解 ssh 代理这么详细的教程!我之前一直卡在这块,总是弄不明白怎么配置和使用. 作者的解释很通俗易懂,结合代码示例更是直观易学,简直太棒了!

    有11位网友表示赞同!

ssh转发代理:sshagent使用详解
猫腻

学习远程服务器操作很重要呀,能绕过防火墙限制真是太方便了。看了这个教程明白了为什么ssh代理这么好用,原来可以分阶段转发流量,还能加密传输数据,安全系数高,下次试试看…

    有18位网友表示赞同!

ssh转发代理:sshagent使用详解
空巷

sshagent 真的有用武之地啊!之前为了访问公司内部网络总是绞尽脑汁,没想到sshproxy 可以解决这个问题。这篇指南讲解得非常详细,包含了各种用法,以后可以用它管理多个帐户,方便得多!

    有5位网友表示赞同!

ssh转发代理:sshagent使用详解
你tm的滚

这篇文章写的真不错,将 sschagent 的使用场景与原理结合的很好,很容易理解。建议可以添加一些常见的脚本配置示例,更方便读者上手实践!

    有10位网友表示赞同!

ssh转发代理:sshagent使用详解
拥抱

虽然我是个 SSH 新手,但这个教程还是看得懂的。不过我觉得 对于不同操作系统( Windows, Linux 等) 的操作步骤可以再多加一些差异说明,让读者更容易上手。

    有11位网友表示赞同!

ssh转发代理:sshagent使用详解
焚心劫

有点无聊啊!本来期待看一个深度分析 ssh 代理技术的文章,结果就讲了这些基本用法,一点都不吸引人…

    有7位网友表示赞同!

ssh转发代理:sshagent使用详解
琴断朱弦

看完这篇文章感觉有些空虚,并没有讲解到 ssh 代理的安全性问题,比如如何防范跨越代理访问的攻击。对于网络安全敏感的人来说,这个部分相当重要!

    有8位网友表示赞同!

ssh转发代理:sshagent使用详解
熏染

ssh转发真的太棒了! 尤其是可以用来远程访问公司内部网,完全解决了我之前的一些烦恼

    有20位网友表示赞同!

ssh转发代理:sshagent使用详解
念初

这篇博客写的非常好!简单明了的解释和详细的操作步骤,让我在短时间内就理解了 sschagent 的原理和使用方法,值得收藏!

    有5位网友表示赞同!

ssh转发代理:sshagent使用详解
┲﹊怅惘。

sshagent 可以用来代理转发多个应用的流量,非常方便。特别是对于需要访问内部网络资源的情况,可以有效绕过防火墙限制。

    有16位网友表示赞同!

ssh转发代理:sshagent使用详解
凉话刺骨

学习过程中遇到了一些问题,幸好这篇文档写的很详细,能找到对应的解决方法,感谢作者!

    有17位网友表示赞同!

ssh转发代理:sshagent使用详解
病态的妖孽

这个教程应该更强调 ssh 代理的安全风险,例如弱密码、端口开放带来的潜在威胁。让读者意识到安全的重要性,并采取相应的防护措施!

    有15位网友表示赞同!

ssh转发代理:sshagent使用详解
别伤我i

sshagent 的使用场景其实很多,不仅仅局限于远程访问,还可以用来构建开发环境、分流流量等。希望作者可以扩展一下文章内容,涵盖更多场景!

    有17位网友表示赞同!

ssh转发代理:sshagent使用详解
金橙橙。-

sshagent 用起来确实很方便,尤其是在多平台工作的时候, 可以简化操作过程。这篇博客对 sschagent 的介绍非常全面,适合初学者学习!

    有7位网友表示赞同!

ssh转发代理:sshagent使用详解
服从

我的环境配置稍微复杂一些,但通过这篇文章的步骤,我成功利用ssh代理连接目标服务器。 感谢作者分享这段宝贵经验!

    有13位网友表示赞同!

ssh转发代理:sshagent使用详解
雁過藍天

之前一直使用默认 SSH 选项,直到看到这篇博客才知道 ssh 代理可以这样灵活运用!真是太开眼界了

    有20位网友表示赞同!

ssh转发代理:sshagent使用详解
看我发功喷飞你

sshagent 的使用确实很强大, 但需要注意的是它的安全性问题,需要谨慎配置避免被攻击。建议作者在文章中添加一些安全方面的提示信息!

    有6位网友表示赞同!

ssh转发代理:sshagent使用详解
暖瞳

总结来说,这篇帖子讲清楚了 ssh 代理的概念和使用方法,对新手非常友好,帮助我快速上手。希望后续能更新一些更高级的使用技巧!

    有15位网友表示赞同!

ssh转发代理:sshagent使用详解
男神大妈

这篇关于ssh代理的文章写的不错!通俗易懂、条理清晰,让我很快学会了如何使用 sschagent。真是一份宝贵的学习资源!

    有5位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/122441.html

(0)
小su's avatar小su
上一篇 2024年9月1日 下午3:51
下一篇 2024年9月1日 下午3:56

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注