Pipe

即使在斷開 ssh 後如何讓程序繼續執行?

  • December 31, 2018

我有一個基於 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

基本上,我的最終目標是能夠通過按一下按鈕將流量丟棄到網路上的特定設備。

安全不是問題,因為這是一個家庭實驗室環境。

您可以使用螢幕來執行此操作。

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

步驟是:

  1. 正常打開 ssh 會話。
  2. 安裝畫面。(如果尚未安裝)
  3. 開始一個新的螢幕會話。(只需輸入螢幕並按輸入鍵)
  4. 執行你的命令
  5. 輸入 ctrl + ‘a’ 然後釋放 ctrl 和 a,然後按 ’d’ 斷開螢幕會話。

會話保持在後台執行。即使您註銷並完全關閉 ssh 會話。

如果您使用的是企業級 linux,例如 centos,您可以使用 yum 從發行版的軟體包儲存庫中安裝 screen。

yum -y install screen

如果您使用的是基於 debian 的作業系統,請嘗試使用:

apt-get install screen

安裝後,只需鍵入 screen 即可開始新的螢幕會話。

$$ user@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

$$ detached $$ 您可以使用 netstat 驗證您的程序是否仍在執行。如果您的作業系統支持它,您可以使用 -p 標誌來顯示正在執行的程序 ID。

-p, –program 顯示每個socket所屬的程序的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

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'

引用自:https://unix.stackexchange.com/questions/491602