gpt4 book ai didi

linux - 如果用户突然关闭 ssh session ,如何从 bash 脚本中获知

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:06 24 4
gpt4 key购买 nike

我有一个 bash 脚本,它充当用户通过 ssh 登录的默认 shell。它提供了一个包含多个选项的菜单,其中之一是使用 netcat 发送文件。

我正在使用的嵌入式 linux 的 netcat 缺少 -w 选项,因此如果用户在没有发送文件的情况下关闭 ssh 连接,netcat 命令将永远等待。

我需要知道用户是否突然关闭连接,以便脚本可以终止 netcat 命令并正常退出。

到目前为止我尝试过的事情:

  • 捕获 SIGHUP:它未发出。我能找到的唯一发出的信号是 SIGCONT,但我认为它不可靠且可移植。
  • 使用读取命令的 -t 选项来检测关闭的标准输入:如果不是嵌入式读取命令中的一个愚蠢错误(仅在第一次调用时超时),这将起作用

编辑:

我会尽力回答评论中的问题并进一步说明情况。

我的代码是:

nc -l -p 7576 > /dev/null 2>> $LOGFILE < $TMP_DIR/$BACKUP_FILE &
wait

我忽略了 SIGINT 和 SIGTSTP,但我试图捕获所有信号,但唯一收到的信号是 SIGCONT。

阅读 bash 手册页我发现 SIGHUP 应该同时发送到脚本和 netcat,并且 SIGCONT 被发送到停止的作业以确保它们收到 SIGHUP。

我猜等待使脚本算作已停止,因此它收到了 SIGCONT,但同时等待以某种方式耗尽了 SIGHUP。

所以我尝试更改等待 sleep 时间,然后同时收到 SIGHUP 和 SIGCONT。

问题是:为什么等待会阻塞 SIGHUP?


编辑 2:已解决

我通过使用 -t 选项的 read 内置函数轮询一个封闭的标准输入来解决这个问题。为了解决 read 内置函数中的错误,我在一个新的 bash 中生成它(bash -c "read -t 3 dummy")。

最佳答案

Parent PiD 是否改变?如果是这样,您可以在进程列表中查找父进程并确保进程名称正确。

关于linux - 如果用户突然关闭 ssh session ,如何从 bash 脚本中获知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2827335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com