ssh代理 ssh代理 ssh反向代理自动重连
创始人
2024-02-25 05:37:14
0

SSH系列文章

SSH基础:SSH和SSH服务

SSH转发代理:ssh-用法详解

SSH隧道:端口转发功能详解

使用ssh-之前

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

但如果执行ssh命令所在的主机上保存了多套秘钥且将各公钥分发给了不同的远端主机,这时即使使用了公钥认证,也依然需要输入密码,因为ssh客户端不知道要读取哪个私钥去和该远端主机上的公钥配对。

看下面这张图描述的情况:

上面描述的情形是这样的:ssh客户端要管理群,还要管理群,ssh客户端要为这两个群内的主机使用不同的密钥对。例如要连接群内的主机,使用~这一套秘钥,连接群内的主机,使用~这一套秘钥。

于是,将id_rsa_1.pub分发给webserver群内的每个主机,将id_rsa_2.pub分发给mysqlserver群内的每个主机:

$ssh-copy-id-i~/.ssh/id_rsa_1.pubroot@webserver1$ssh-copy-id-i~/.ssh/id_rsa_1.pubroot@webserver2$ssh-copy-id-i~/.ssh/id_rsa_1.pubroot@webserver3$ssh-copy-id-i~/.ssh/id_rsa_2.pubroot@mysqlserver1$ssh-copy-id-i~/.ssh/id_rsa_2.pubroot@mysqlserver2$ssh-copy-id-i~/.ssh/id_rsa_2.pubroot@mysqlserver3

这一切进行的都很欢乐,但是一连接,发现还是要密码:

$sshroot@webserver1快输入root@webserver's密码:???$sshroot@mysqlserver1快输入root@mysqlserver's密码:???

这是因为ssh客户端连接webserver1的时候,除了默认会读取的规范私钥文件id_rsa(或其它秘钥类型)外,不会自动读取任何一个文件,同理连接mysqlserver1也一样。

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

$ssh-i~/.ssh/id_rsa_1root@webserver1$ssh-i~/.ssh/id_rsa_2root@mysqlserver1

好欢乐,终于连上了。但是真恶心,还要指定连接私钥。

不仅如此,如果私钥是加密(passphrase)的,指定私钥的时候还得输入这个passphrase密码。

ssh-agent是干什么的

程序员很不满意这样的连接方式,于是创造了一个中间的私钥管理者ssh-agent:你不是不知道怎么配对吗,我帮你配。而且这个功能对于程序员来说,soeasy。

我在ssh身份认证阶段中解释过,ssh认证的过程其实是客户端(ssh命令端)读取自己的私钥并推导出指纹发送给服务端(sshd端),服务端也使用自己保存的公钥推导出指纹进行对比,如果指纹相同说明服务端的公钥和客户端的私钥是配对的。如下是公钥、私钥的指纹计算方式:

$ssh-keygen-l-f~/.ssh/id_rsa_220482c:e9:70:a8:f5:8d:87:9f:8c:de:cf:cf:14:f4:40:52root@xuexi.longshuai.com(RSA)$ssh-keygen-l-f~/.ssh/id_rsa_2.pub20482c:e9:70:a8:f5:8d:87:9f:8c:de:cf:cf:14:f4:40:52root@xuexi.longshuai.com(RSA)

这个密钥身份认证的过程是理解ssh-agent的关键。

ssh-agent的主功能大概如下图描述:

使用ssh-agent后,可以通过ssh-add命令向ssh-agent注册本机的私钥,ssh-agent会自动推导出这个私钥的指纹(实际上是ssh-add计算的)保存在自己的小本本里(内存),以后只要ssh连接某主机(某用户),将自动转发给ssh-agent,ssh-agent将自动从它的小本本里查找私钥的指纹并将其发送给服务端(sshd端)。如此一来,ssh客户端就无需再指定使用哪个私钥文件去连接。

总的看上去,ssh-agent的角色就是帮忙存储、查找并发送对应的指纹而已,也就是说它是一个连接的转发人,扮演的是一个代理的角色。

ssh并非一定支持ssh-agent转发的连接。要使用ssh-agent的转发功能,需要在sshd_config中开启AllowAgentForwarding选项,在ssh_config中开启ForwardAgent选项。

使用ssh-agent和ssh-add

先将ssh-agent运行起来:

$ssh-agentSSH_AUTH_SOCK=/tmp/ssh-GiORRAqMXEFt/agent.28161;exportSSH_AUTH_SOCK;SSH_AGENT_PID=28162;exportSSH_AGENT_PID;echoAgentpid28162;

输出结果中明确说明了导出了几个环境变量,同时也可以知道ssh-agent使用UnixDomain套接字的方式监听在本机上以及其pid为28162。到时候可以直接使用kill28162杀掉这个进程,更直接的方式是使用ssh-agent-k,它会根据当前的环境变量SSH_AGENT_PID来杀进程。

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

#先杀掉刚才的ssh-agent$kill28162$eval`ssh-agent`Agentpid28173

ssh客户端上运行ssh-agent后,就可以使用ssh-add命令向ssh-agent添加私钥(如果私钥使用了passhprase密码,则要求输入一次密码)。

$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的值并发送添加请求给对应套接字的,所以这个套接字环境变量非常重要。

之后再使用公钥认证就可以直接连接到目标主机:

$sshroot@webserver1$sshroot@webserver2$sshroot@webserver3$sshroot@mysqlserver1$sshroot@mysqlserver2$sshroot@mysqlserver3

ssh-agent的痛点和解决方案

ssh-agent的工作是依赖于环境变量SSH_AUTH_SOCK和SSH_AGENT_PID的,不同用户,不同终端,只要没有和这两个环境变量配对的ssh-agent,这个agent进程就不可使用。要想使用某个agent,就必须在自己的shell中先设置好这两个环境变量。

另外需要注意的是,以eval`ssh-agent`启动的方式会直接让ssh-agent工作在后台,它自己会独立成自己的进程组,其父进程或终端退出后它仍然会挂靠在pid=1的init/systemd下。而ssh-agent的工作是依赖于环境变量SSH_AUTH_SOCK和SSH_AGENT_PID的,shell或终端退出后这两个环境变量就消失了,使得之前运行的ssh-agent被多余地保留在后台。

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

$tree/tmp/ssh*/tmp/ssh-q3tM0FzpCcdU└──agent.28629/tmp/ssh-SkKrrkK6qLDq└──agent.28817

于是环境变量SSH_AUTH_SOCK的值已经得到了。再根据agent.ppid中的ppid值,将其加上1,就是其子进程ssh-agent进程的PID值。例如,想要使用上面agent.28629对应的ssh-agent,那么设置:

exportSSH_AUTH_SOCK=/tmp/ssh-q3tM0FzpCcdU/agent.28629exportSSH_AGENT_PID=28630

我们完全可以自己写一个脚本来自动化获取并设置这些环境变量。

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

下载好其中的ssh-find-agent.sh脚本,并放到某个目录下。例如直接放在/etc/profile.d目录下,然后给执行权限:

$wgethttps://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中执行(如果在旧终端上,需要先source该shell脚本):

$ssh-find-agent-a

它会自动寻找到第一个ssh-agent进程并配置好相关环境变量:

$ssh-find-agent-a$echo$SSH_AUTH_SOCK/tmp/ssh-SkKrrkK6qLDq/agent.28817$echo$SSH_AGENT_PID28818

不给任何参数的ssh-find-agent函数会列出当前能找到的ssh-agent进程以及相关环境变量和编号。

$ssh-find-agentexportSSH_AUTH_SOCK=/tmp/ssh-q3tM0FzpCcdU/agent.28ssh代理629#1)exportSSH_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。

除了上面的方法,还可以直接使用另一种管理工具:keychain。

$yuminstall-ykeychain

keychain能很好的管理ssh-agent,可以去查看下如何使用。

管理ssh-agent中的私钥

ssh-agent命令的选项:

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

ssh-add命令的选项(部分选项):

-D删除ssh-agent中所有私钥(指纹)-dkey_file删除指定私钥-L列出agent当前主机上所有公钥参数,即公钥文件中的内容-l列出agent当前已保存的指纹信息-t设置私钥(指纹)的有效期。默认单位为秒,可以指定m(分钟)、h(小时)、d(天)、w(周)-x使用一个密码将agent锁起来(lock),锁起来的agent将不再提供任何服务-X解锁agent

相关阅读

  • ssh隧道代理方法
  • windows下用ssh做代理的方法
  • ssh 通过代理连接服务器
  • ssh 代理设置
  • 透过代理连接ssh Lainmes Blog
  • linux 中国◆开ssh代理源社区
  • 各地特色小吃加盟
  • 小吃连锁加盟店
  • ssh代理
  • 分享到: QQ空间 新浪微博 腾讯微博 人人网 微信 百度 复制网址

    相关内容

    热门资讯

    深度科普!白金岛三打哈可以开挂... 您好,白金岛三打哈这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别...
    揭秘外挂教程!网易棋牌开挂原理... 网易棋牌神器是一款可以让一直输的玩家,快速成为一个“必胜”的ai辅助神器,网易棋牌可以一键让你轻松成...
    如何才能开挂!中至江西麻将天天... a您好,中至江西麻将确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且...
    玩家攻略!东阳四副牌开挂方法辅... 玩家攻略!东阳四副牌开挂方法辅助插件-其实真的有挂核心提示:1.通过添加客服需要了解加薇136763...
    给大家一一科普!微乐宁夏麻将开... 您好,微乐宁夏麻将这款游戏可以开挂的,确实是有挂的,很多玩家微乐宁夏麻将在这款游戏中打牌都会发现很多...
    绝对包赢!微乐互娱拿好牌设置牌... 您好,微乐互娱这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,...
    绝对包赢!全来跑风辅助安装教程... 绝对包赢!全来跑风辅助安装教程开挂程序+详细开挂教程核心提示:1.通过添加客服需要了解加薇13676...
    23.44亿元到账!推进乡村振... 23.44 亿元到账!这一巨额资金的到账,如同注入乡村振兴的强劲动力。它将如同甘霖滋润广袤的乡村大地...
    打破认知!天天乐清麻将怎么识别... 您好:天天乐清麻将这款游戏是可以开挂的,确实是有挂的,很多玩家在天天乐清麻将这款游戏中打牌都会发现很...
    连江东岱葡萄熟了 连江东岱,那片葡萄田仿佛被大自然的画笔点染得五彩斑斓。此刻,葡萄熟了,颗颗圆润饱满,如晶莹剔透的宝石...
    出奇制胜!乐享牛牛随意选择牌型... 您好,乐享牛牛这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,...
    对方不付尾款画师自损壁画 法院... 在某艺术交易中,画师完成精美壁画后,对方却迟迟未付尾款。无奈之下,画师选择自损壁画以表达维权决心。然...
    正版包赢!海乐城专用控制想要的... 正版包赢!海乐城专用控制想要的牌-开挂神器让你风生水起核心提示:1.通过添加客服需要了解加薇1367...
    闽侯最大荔枝村“元红”珍品上市... 闽侯的“元红”荔枝村迎来了盛事,其最大荔枝村的“元红”珍品正式上市啦!这片荔枝园犹如一片绿色的海洋中...
    操作简单!全民雀神辅助器开挂软... 您好:全民雀神这款游戏是可以开挂的,确实是有挂的,很多玩家在全民雀神这款游戏中打牌都会发现很多用户的...
    上半年福建锂电池出口635.6... 上半年,福建在锂电池出口领域取得了耀眼成绩。635.68 亿元的出口额,如同璀璨星辰,彰显着福建在这...
    靠谱包赢!新九五牌九怎么识别别... 亲,您好新九五牌九这款游戏可以开挂,确实是有挂的,非常多玩家都在用呢。很多玩家在这款游戏中打牌都会发...
    海峡蔬菜批发市场创新管理模式 ... 海峡蔬菜批发市场积极创新管理模式,为批发商们注入了新的活力。在这一模式下,批发商们凭借自身的努力和智...
    不必恐慌!中至九江麻将辅助设置... 不必恐慌!中至九江麻将辅助设置牌型程序+详细开挂方法教程核心提示:1.通过添加客服需要了解加薇136...
    手语传情!听障人士“畅游”福建... 在福建博物院,一场特别的“畅游”正在上演。听障人士们通过灵动的手语,与展览中的历史文化亲密接触。他们...