Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道ssh已断开连接并使用bash脚本重试_Bash_Ssh_Reverse - Fatal编程技术网

如何知道ssh已断开连接并使用bash脚本重试

如何知道ssh已断开连接并使用bash脚本重试,bash,ssh,reverse,Bash,Ssh,Reverse,我使用反向ssh连接到远程客户端,操作员运行反向一次并离开客户端系统 如何编写bash脚本,当反向ssh从服务器断开连接时,请重试连接到服务器(ssh)您可以使用netstat-ntp | grep“:22”或ss-ntp | grep“:22”查看到ssh端口的已建立连接,然后使用grep筛选您正在查找的ip地址。如果找不到连接,请重新连接隧道。您可以使用netstat-ntp | grep:22“或ss-ntp | grep:22”查看已建立的ssh端口连接,然后使用grep筛选您要查找的i

我使用反向ssh连接到远程客户端,操作员运行反向一次并离开客户端系统
如何编写bash脚本,当反向ssh从服务器断开连接时,请重试连接到服务器(ssh)

您可以使用
netstat-ntp | grep“:22”
ss-ntp | grep“:22”
查看到ssh端口的已建立连接,然后使用grep筛选您正在查找的ip地址。如果找不到连接,请重新连接隧道。

您可以使用
netstat-ntp | grep:22“
ss-ntp | grep:22”
查看已建立的ssh端口连接,然后使用grep筛选您要查找的ip地址。如果找不到连接,请重新连接隧道。

如果只想重试命令直到成功,可以使用以下模式:

while ! ssh [...]
do
    echo "Command failed, retrying..." >&2
done

如果您只是想重试一个命令,直到它成功为止,您可以使用以下模式:

while ! ssh [...]
do
    echo "Command failed, retrying..." >&2
done
使用。AutoSh“自动重新启动[s]SSH会话和隧道”

我使用AutoSh来保持我所依赖的反向通道的打开。它工作得很好,即使长时间失去联系

下面是我用来创建隧道的脚本:

#!/bin/bash
AUTOSSH_GATETIME=0
export AUTOSSH_GATETIME
autossh -f -N -R 8022:localhost:22 username@host -o "ServerAliveInterval 45" -o "ServerAliveCountMax 2"
我在启动时使用此cronjob执行此脚本:

@reboot /home/scripts/./persistent-tunnel.sh
使用。AutoSh“自动重新启动[s]SSH会话和隧道”

我使用AutoSh来保持我所依赖的反向通道的打开。它工作得很好,即使长时间失去联系

下面是我用来创建隧道的脚本:

#!/bin/bash
AUTOSSH_GATETIME=0
export AUTOSSH_GATETIME
autossh -f -N -R 8022:localhost:22 username@host -o "ServerAliveInterval 45" -o "ServerAliveCountMax 2"
我在启动时使用此cronjob执行此脚本:

@reboot /home/scripts/./persistent-tunnel.sh

您可能希望了解ssh选项ServerAliveInterval、ServerAliveCountMax和TCPKeepAlive,因为有时您的代码行会在没有明确说明这一点的情况下终止,让我演示一下:

#!/bin/sh

while true; do

ssh -T user@host \
  -o IdentityFile=~/.ssh/tunnel \
  -o UserKnownHostsFile=~/.ssh/known_hosts.tunnel \
  pkill -f "^sshd:\ user\ \ \ \ $" # needs to be edited for nearly every case

sleep 2

ssh -T -N user@host \
  -o IdentityFile=~/.ssh/tunnel \
  -o UserKnownHostsFile=~/.ssh/known_hosts.tunnel \
  -o Batchmode=yes \
  -o ExitOnForwardFailure=yes \
  -o ServerAliveCountMax=1 \
  -o ServerAliveInterval=60 \
  -o LocalForward=127.0.0.1:2501=127.0.0.1:25 \
  -o RemoteForward=127.0.0.1:2501=127.0.0.1:25

sleep 60

done

您可能希望了解ssh选项ServerAliveInterval、ServerAliveCountMax和TCPKeepAlive,因为有时您的代码行会在没有明确说明这一点的情况下终止,让我演示一下:

#!/bin/sh

while true; do

ssh -T user@host \
  -o IdentityFile=~/.ssh/tunnel \
  -o UserKnownHostsFile=~/.ssh/known_hosts.tunnel \
  pkill -f "^sshd:\ user\ \ \ \ $" # needs to be edited for nearly every case

sleep 2

ssh -T -N user@host \
  -o IdentityFile=~/.ssh/tunnel \
  -o UserKnownHostsFile=~/.ssh/known_hosts.tunnel \
  -o Batchmode=yes \
  -o ExitOnForwardFailure=yes \
  -o ServerAliveCountMax=1 \
  -o ServerAliveInterval=60 \
  -o LocalForward=127.0.0.1:2501=127.0.0.1:25 \
  -o RemoteForward=127.0.0.1:2501=127.0.0.1:25

sleep 60

done

我有一个稍微不同的方法。 如果您有脏的断开连接,我的方法总是尝试重新连接:“~”或“连接已被远程主机关闭” 但是,如果您使用“CRTL+D”或“exit”断开连接,它只会断开连接并向您显示一些连接信息

#/bin/bash  
if [ -z "$1" ]
then
        echo '''
        Please also provide ssh connection details.
        '''
        exit 1
fi  
retries=0
repeat=true
today=$(date)  
while "$repeat"
do
        ((retries+=1)) &&
        echo "Try number $retries..." &&
        today=$(date) &&
        ssh "$@" &&
        repeat=false
        sleep 5
done  
echo """
        Disconnected sshx after a successful login.
        Total number of tries = $retries
        Connected at:
        $today
"""

我有一个稍微不同的方法。 如果您有脏的断开连接,我的方法总是尝试重新连接:“~”或“连接已被远程主机关闭” 但是,如果您使用“CRTL+D”或“exit”断开连接,它只会断开连接并向您显示一些连接信息

#/bin/bash  
if [ -z "$1" ]
then
        echo '''
        Please also provide ssh connection details.
        '''
        exit 1
fi  
retries=0
repeat=true
today=$(date)  
while "$repeat"
do
        ((retries+=1)) &&
        echo "Try number $retries..." &&
        today=$(date) &&
        ssh "$@" &&
        repeat=false
        sleep 5
done  
echo """
        Disconnected sshx after a successful login.
        Total number of tries = $retries
        Connected at:
        $today
"""

我有一个稍微不同的方法。 如果您有脏的断开连接,我的方法总是尝试重新连接:“~”或“连接已被远程主机关闭” 但是,如果您使用“CRTL+D”或“exit”断开连接,它只会断开连接并向您显示一些连接信息

#/bin/bash  
if [ -z "$1" ]
then
        echo '''
        Please also provide ssh connection details.
        '''
        exit 1
fi  
retries=0
repeat=true
today=$(date)  
while "$repeat"
do
        ((retries+=1)) &&
        echo "Try number $retries..." &&
        today=$(date) &&
        ssh "$@" &&
        repeat=false
        sleep 5
done  
echo """
        Disconnected sshx after a successful login.
        Total number of tries = $retries
        Connected at:
        $today
"""

我有一个稍微不同的方法。 如果您有脏的断开连接,我的方法总是尝试重新连接:“~”或“连接已被远程主机关闭” 但是,如果您使用“CRTL+D”或“exit”断开连接,它只会断开连接并向您显示一些连接信息

#/bin/bash  
if [ -z "$1" ]
then
        echo '''
        Please also provide ssh connection details.
        '''
        exit 1
fi  
retries=0
repeat=true
today=$(date)  
while "$repeat"
do
        ((retries+=1)) &&
        echo "Try number $retries..." &&
        today=$(date) &&
        ssh "$@" &&
        repeat=false
        sleep 5
done  
echo """
        Disconnected sshx after a successful login.
        Total number of tries = $retries
        Connected at:
        $today
"""

如果可以在您的Linux版本上运行,请使用AutoSh。它不在我的上,因为它是一个过时的Linux发行版,用于定制NAS设备

另一种选择是crontab中的简单bash脚本,如下所示:

维护\u反向\u ssh\u tunnel.sh

if!netstat-planet | grep myserver_ip_或| name | grep已建立>/dev/null;然后
echo“反向SSH关闭-重新启动隧道”
ssh-fN-r32999:localhost:22-r28080:localhost:80myusername@myserver_ip_or_name
fi

myusername
myserver\u ip\u或\u name
替换为您的用户和服务器

然后,通过键入
crontab-e
并添加以下行,向crontab添加一个条目:

1****/path\u to\u my\u script/mainter\u reverse\u ssh\u tunnel.sh

确保对脚本具有执行权限:


chmod 755 mainter\u reverse\u ssh\u tunnel.sh

如果AutoSh在您的Linux版本上运行,请使用它。它不在我的上,因为它是一个过时的Linux发行版,用于定制NAS设备

另一种选择是crontab中的简单bash脚本,如下所示:

维护\u反向\u ssh\u tunnel.sh

if!netstat-planet | grep myserver_ip_或| name | grep已建立>/dev/null;然后
echo“反向SSH关闭-重新启动隧道”
ssh-fN-r32999:localhost:22-r28080:localhost:80myusername@myserver_ip_or_name
fi

myusername
myserver\u ip\u或\u name
替换为您的用户和服务器

然后,通过键入
crontab-e
并添加以下行,向crontab添加一个条目:

1****/path\u to\u my\u script/mainter\u reverse\u ssh\u tunnel.sh

确保对脚本具有执行权限:


chmod 755维护\u reverse\u ssh\u tunnel.sh

您的意思是“反向ssh隧道”吗?有时ssh会话可能会显示为“挂起”,进程无法消失。听起来你想要一种“看门狗”来测试函数隧道,而不仅仅是检查以确保进程仍然存在。有很多方法可以做到这一点,你可以研究一下。如果您在实现一个时遇到问题,请提出一个问题,说明您尝试过的代码以及预期和实际结果。您的意思是“反向SSH隧道”吗?有时SSH会话可能会出现“挂起”,进程无法消失。听起来你想要一种“看门狗”来测试函数隧道,而不仅仅是检查以确保进程仍然存在。有很多方法可以做到这一点,你可以研究一下。如果您在实现一个时遇到问题,请提出一个问题,说明您尝试过的代码,以及您的预期和实际结果。显然,如果您使用
-f
,则
AutoShu GATETIME
设置为0,因此我认为您不需要它。a