我有一个基于 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/
步骤是:
- 正常打开 ssh 会话。
- 安装屏幕。 (如果尚未安装)
- 开始一个新的屏幕会话。 (只需输入 screen 并按 Enter 键)
- 运行你的命令
- 输入 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