BASH 脚本终止时 SSH 会话关闭(非常非标准的情况)

BASH 脚本终止时 SSH 会话关闭(非常非标准的情况)

我从 BASH 脚本启动 ssh 会话。因此,根本不需要控制台。(这是反向 SSH 所必需的)。

我需要 SSH 会话:

  1. 脚本完成后保持活动;
  2. 从另一个脚本终止它(当然是在某些条件下);

正在考虑虚拟终端会话(可能使用 cat...),但不知道如何操作,或者可能有另一种“正确”的方法来做到这一点。

TNX(提前)!

答案1

我假设您正在尝试维护 SSH 隧道。有很多方法可以做到这一点,但我不知道是否有“正确”的方法,因为这在很大程度上取决于您实际要实现的目标。

一种方法(较简单的方法之一)是在屏幕中启动 SSH 会话,为其指定一个唯一名称,然后使用屏幕的命令终止它。以下是执行此操作的示例脚本:

#!/bin/bash                                                                 

SCREENNAME="the_great_ssh_tunnel"
SSHCOMMAND="ssh -N -R ...."                                     

case "$1" in                                                                
  start)                                                                    
    if screen -ls|grep -q "$SCREENNAME"; then                               
      echo "Already running."                                               
    else                                                                    
      screen -m -d -S "$SCREENNAME" $SSHCOMMAND                             
      echo "Started."                                                       
    fi                                                                      
    ;;                                                                      
  stop)                                                                     
    if screen -ls|grep -q "$SCREENNAME"; then                               
      echo "Stopping"                                                       
      screen -S "$SCREENNAME" -X kill                                       
    else                                                                    
      echo "Not running"                                                    
    fi                                                                      
    ;;                                                                      

  isrunning)                                                                
    if screen -ls|grep -q "$SCREENNAME"; then                               
      echo "Running."                                                       
    else                                                                    
      echo "Not running."                                                   
    fi                                                                      
    ;;                                                                      

esac

如果您具有 root 访问权限,您可能希望将其转换为 systemd 单元。

相关内容