大家好,关于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-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-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目录下,然后赋予执行权限:
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 命令的选项(部分选项)覆盖:
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/122441.html
用户评论
哭着哭着就萌了°
终于找到了讲解 ssh 代理这么详细的教程!我之前一直卡在这块,总是弄不明白怎么配置和使用. 作者的解释很通俗易懂,结合代码示例更是直观易学,简直太棒了!
有11位网友表示赞同!
猫腻
学习远程服务器操作很重要呀,能绕过防火墙限制真是太方便了。看了这个教程明白了为什么ssh代理这么好用,原来可以分阶段转发流量,还能加密传输数据,安全系数高,下次试试看…
有18位网友表示赞同!
空巷
sshagent 真的有用武之地啊!之前为了访问公司内部网络总是绞尽脑汁,没想到sshproxy 可以解决这个问题。这篇指南讲解得非常详细,包含了各种用法,以后可以用它管理多个帐户,方便得多!
有5位网友表示赞同!
你tm的滚
这篇文章写的真不错,将 sschagent 的使用场景与原理结合的很好,很容易理解。建议可以添加一些常见的脚本配置示例,更方便读者上手实践!
有10位网友表示赞同!
拥抱
虽然我是个 SSH 新手,但这个教程还是看得懂的。不过我觉得 对于不同操作系统( Windows, Linux 等) 的操作步骤可以再多加一些差异说明,让读者更容易上手。
有11位网友表示赞同!
焚心劫
有点无聊啊!本来期待看一个深度分析 ssh 代理技术的文章,结果就讲了这些基本用法,一点都不吸引人…
有7位网友表示赞同!
琴断朱弦
看完这篇文章感觉有些空虚,并没有讲解到 ssh 代理的安全性问题,比如如何防范跨越代理访问的攻击。对于网络安全敏感的人来说,这个部分相当重要!
有8位网友表示赞同!
熏染
ssh转发真的太棒了! 尤其是可以用来远程访问公司内部网,完全解决了我之前的一些烦恼
有20位网友表示赞同!
念初
这篇博客写的非常好!简单明了的解释和详细的操作步骤,让我在短时间内就理解了 sschagent 的原理和使用方法,值得收藏!
有5位网友表示赞同!
┲﹊怅惘。
sshagent 可以用来代理转发多个应用的流量,非常方便。特别是对于需要访问内部网络资源的情况,可以有效绕过防火墙限制。
有16位网友表示赞同!
凉话刺骨
学习过程中遇到了一些问题,幸好这篇文档写的很详细,能找到对应的解决方法,感谢作者!
有17位网友表示赞同!
病态的妖孽
这个教程应该更强调 ssh 代理的安全风险,例如弱密码、端口开放带来的潜在威胁。让读者意识到安全的重要性,并采取相应的防护措施!
有15位网友表示赞同!
别伤我i
sshagent 的使用场景其实很多,不仅仅局限于远程访问,还可以用来构建开发环境、分流流量等。希望作者可以扩展一下文章内容,涵盖更多场景!
有17位网友表示赞同!
金橙橙。-
sshagent 用起来确实很方便,尤其是在多平台工作的时候, 可以简化操作过程。这篇博客对 sschagent 的介绍非常全面,适合初学者学习!
有7位网友表示赞同!
服从
我的环境配置稍微复杂一些,但通过这篇文章的步骤,我成功利用ssh代理连接目标服务器。 感谢作者分享这段宝贵经验!
有13位网友表示赞同!
雁過藍天
之前一直使用默认 SSH 选项,直到看到这篇博客才知道 ssh 代理可以这样灵活运用!真是太开眼界了
有20位网友表示赞同!
看我发功喷飞你
sshagent 的使用确实很强大, 但需要注意的是它的安全性问题,需要谨慎配置避免被攻击。建议作者在文章中添加一些安全方面的提示信息!
有6位网友表示赞同!
暖瞳
总结来说,这篇帖子讲清楚了 ssh 代理的概念和使用方法,对新手非常友好,帮助我快速上手。希望后续能更新一些更高级的使用技巧!
有15位网友表示赞同!
男神大妈
这篇关于ssh代理的文章写的不错!通俗易懂、条理清晰,让我很快学会了如何使用 sschagent。真是一份宝贵的学习资源!
有5位网友表示赞同!