如何让进程在ssh断开后继续运行?

如何让进程在ssh断开后继续运行?

我有一个基于 Linux 的路由器,我试图用家庭自动化控制器“控制”它。在我的自动化控制器上,我可以利用“双向字符串”驱动程序,在按下遥控器上的按钮后将字符串发送到 Linux 路由器。我希望发送的字符串在路由器上执行。

我可以通过在 ssh 进入路由器时运行以下命令来完成此操作:

$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f

只要我保持终端窗口打开,自动化控制器就能够发送改变 iptables 的字符串。

我遇到的问题是,在关闭 ssh 连接后,这种情况不会持续存在。有没有办法让路由器在 ssh 连接关闭后继续侦听并执行来自控制器的命令?

这是我发送的字符串的示例:

iptables%20-I%20INPUT%20-s%20192.168.1.214%20-j%20DROP%0A

基本上,我的最终目标是能够通过按一下按钮来减少网络上特定设备的流量。

安全性不是问题,因为这是家庭实验室环境。

答案1

您希望用于nohup让您的命令即使在 ssh 连接关闭后也能运行(远程接线员挂断电话)。该过程与中相同这个答案:

nohup sh -c 'rm -f /tmp/f ; mkfifo /tmp/f && cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f'

答案2

您可以使用屏幕来执行此操作。

https://www.gnu.org/software/screen/

步骤是:

  1. 正常打开 ssh 会话。
  2. 安装屏幕。 (如果尚未安装)
  3. 开始一个新的屏幕会话。 (只需输入 screen 并按 Enter 键)
  4. 运行你的命令
  5. 输入 ctrl + 'a',然后释放 ctrl 和 a,然后按 'd' 断开屏幕会话。

会话在后台保持运行。即使您注销并完全关闭 ssh 会话。

如果您使用的是企业 Linux(例如 centos),则可以使用 yum 从发行版的软件包存储库安装 screen。

yum -y install screen

如果您使用的是基于 Debian 的操作系统,请尝试使用:

apt-get install screen

安装后,只需键入 screen 即可启动新的屏幕会话。

[用户@localhost ~]$屏幕

注意:这将清除屏幕并开始新的会话。

运行你的命令:

[user@localhost ~]$ rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f

分离屏幕会话:

Ctrl+a、d

[分离]

您可以使用 netstat 验证您的进程是否仍在运行。如果您的操作系统支持,您可以使用 -p 标志来显示正在运行的进程 ID。

-p, --program 显示每个套接字所属程序的 PID 和名称。

[user@localhost ~]$ netstat -anp | grep 1234
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:1234              0.0.0.0:*                   LISTEN      30599/nc

您可以使用 ps 来显示该进程仍在运行:

[user@localhost~]$ ps -ef | grep [3]1037
500      31037 31019  0 21:45 pts/2    00:00:00 nc -l 127.0.0.1 1234

注意:在 pid 的第一个数字周围放置方括号“[]”是一个正则表达式的小技巧,以避免显示 grep 进程本身。本质上是错误匹配,而不是您的实际过程。

您可以使用 screen -ls 显示分离的屏幕会话

[user@localhost~]$ screen -ls
There is a screen on:
        30562.pts-0.localhost  (Detached)
1 Socket in /var/run/screen/S-user.

您可以使用 screen -r 或 screen -x 和会话名称重新附加它

[user@localhost ~]$ screen -x 30562.pts-0.localhost

相关内容