【问题标题】:How to drop ssh session in shell? ssh keeps session alive even after script exits如何在 shell 中删除 ssh 会话? ssh 即使在脚本退出后也能保持会话活跃
【发布时间】:2021-04-13 11:36:41
【问题描述】:

如何在用 bash 编写的自动化脚本中删除 ssh 会话? 我有一个在本地运行的脚本来触发远程机器上的脚本,而远程机器上的脚本将触发另一个在后台运行的脚本...... 我想在远程机器仍在运行后台脚本的同时删除会话,所以我使用 nohup。

我有一个本地脚本localScript如下

#!/bin/bash
echo "start remote trigger script..."
./trigger

trigger 脚本已在我的远程计算机上准备就绪,其中包含以下几行:

#!/bin/bash
echo "start script test..."
nohup ./test > output &
echo "start test script in background, exit..."
exit

test 脚本是一个基本的睡眠循环,仅用于测试...

#!/bin/bash
c=1
while [ "$c" -le 10 ]
do
        echo "sleep 10 seconds, c=$c"
        sleep 10s
        c=$((c+1))
        if [ "$c" -eq 10 ]
        then
                echo "max count reach, exit"
                exit
        fi
done

但是我发现 ssh 使会话保持活动状态(等待空闲 100 秒),我怎样才能删除会话? 我使用的命令是 sshpass -p XXXX ssh -o StrictHostKeyChecking=no user@IP 'bash -s' < localScript

【问题讨论】:

  • & 替换为2>&1 &2>/dev/null &
  • 还是不行.... :(
  • 我相信当您调用ssh 来运行没有PTY 的远程命令时,远程sshd 进程会在它为远程进程的标准输出创建的PIPE 上获得EOF 时关闭会话.换句话说,你得到这个是因为“test”脚本进程,或“bash -s”进程,或其他进程仍在运行,并且“bash -s”进程的标准输出有一个打开的文件描述符。除了脚本中的内容之外,您的 shell 启动文件(.bashrc 等)可能正在后台启动其他命令?
  • 我想不出更好的解决方案,所以我使用的是timeout seconds ssh ...

标签: bash shell ssh


【解决方案1】:

如果您强制执行伪终端分配 (-t),这应该可以工作:

sshpass -p XXXX ssh -t -o StrictHostKeyChecking=no user@IP 'bash -s' < localScript

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多