在shell脚本中检查单个SSH隧道的过程?

安德鲁·普拉斯(Andrew Plas)

在远程实验室系统上,我有一个Shell脚本,该脚本启动到我的主Jumpbox的反向SSH隧道,每5分钟执行一次cron作业来运行它。如果SSH隧道已启动,则什么也不会发生;如果SSH隧道已关闭,它将启动它。

#!/bin/bash
createTunnel() {
/usr/bin/ssh -N -R :2222:localhost:22 [email protected]
if [[ $? -eq 0 ]]; then
 echo Tunnel to jumpbox created successfully
else
 echo An error occurred creating a tunnel to jumpbox. RC was $?
fi
}
/bin/pidof ssh
if [[ $? -ne 0 ]]; then
  echo Creating new tunnel connection
  createTunnel
fi

这非常可靠,以确保在重新启动或我的跳箱IP发生更改时,我可以访问远程计算机。但是,我最近在该系统中添加了第二个SSH隧道,并且出现了以下情况:两个隧道之一发生故障,并且从未重新建立。看来,由于建立了一个隧道,因此pidof输出仍返回PID,因此该脚本从未运行过“ createTunnel”。由于我有两个SSH隧道,因此pidof输出显示两个PID:

$ /bin/pidof ssh
28281 28247

如何调整脚本以确定是否只有一条隧道断开?

卡米尔·马乔洛夫斯基

我的想法:

  1. PID文件。我认为这是一种通用方法。
  2. XY问题,使用autossh

(其他一些答案可能会详细说明这些想法。)

  1. 有两个脚本,对不对?(不完全符合DRY)。给他们起不同的名字。您的脚本等待其ssh退出。附加实例ssh应该检查自己名称的pid,而不是检查的pid 恰好一个pid两个pid表示没有先前的脚本仍在运行:

    [ $(pidof -x scriptname | wc -w) -eq 2 ] && createTunnel
    

    为什么要两个?因为$()启动子壳也很重要。很脏,哦。

  2. 我认为有些开箱即用。创建两个具有唯一名称的符号链接,例如:

    ln -s /usr/bin/ssh ssh-foo
    ln -s /usr/bin/ssh ssh-bar
    

    让第一个脚本运行ssh-foo,让第二个脚本运行ssh-bar它们的pidof调用也应该针对ssh-foossh-bar分别针对这样他们就不会混在一起。作为奖励,额外的费用ssh(将来可能会以完全不同的原因运行)不会对其产生影响。

最后:

  1. 您无需检查任何内容。

    /usr/bin/ssh -o ExitOnForwardFailure=yes -N -R :2222:localhost:22 [email protected]
    

    如果隧道已经存在,则端口转发肯定会失败并ssh退出。我猜您可以直接从crontab运行此行,不需要脚本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在ssh shell脚本中检查docker版本

来自分类Dev

在ssh shell脚本中检查docker版本

来自分类Dev

SSH in Shell脚本中的SSH

来自分类Dev

如何在ssh隧道中检查netcat的日志

来自分类Dev

在脚本中检查SSH故障

来自分类Dev

如何检查是否正在使用ssh隧道?

来自分类Dev

SSH隧道中的username @ host

来自分类Dev

Docker容器中的SSH隧道

来自分类Dev

配置中的反向SSH隧道

来自分类Dev

Layman术语中的SSH隧道

来自分类Dev

SSH密钥在隧道中丢失

来自分类Dev

SSH隧道中的username @ host

来自分类Dev

检查在shell脚本内是否可以使用ssh?

来自分类Dev

如何在执行过程中暂停shell脚本?

来自分类Dev

交互式shell中的会话中的过程与脚本中的过程

来自分类Dev

检查shell脚本

来自分类Dev

Linux Shell 脚本:脚本检查

来自分类Dev

VPN隧道与SSH隧道

来自分类Dev

ssh隧道中断以解锁密钥-寻找单个命令

来自分类Dev

从其他终端中的ssh启动的shell脚本中的su

来自分类Dev

Shell脚本-检查单个字符输入是大写还是小写还是特殊字符

来自分类Dev

Rust中SSH上的TCP隧道

来自分类Dev

ssh隧道-绑定:地址已在使用中

来自分类Dev

在SSH隧道中创建转发的端口

来自分类Dev

在Windows中管理隧道的SSH端口

来自分类Dev

检查SSH隧道正在使用哪个网络接口

来自分类Dev

检查并自动重新建立反向 ssh 隧道

来自分类Dev

如何使用SSH隧道编写数据库迁移脚本?

来自分类Dev

通过 ssh 隧道按需执行本地 Python 脚本