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つだけ押してネットワーク内の特定のデバイスへのトラフィックを減らすことです。

ホームラップ環境なので安全は問題になりません。

答え1

nohupSSH接続が閉じた後でもコマンドを実行できるようにしたい(遠隔交換員が電話を切る。)。プロセスは と同じです。この回答:

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. 新しいスクリーンセッションを開始してください。 (画面を入力してEnterを押します)
  4. コマンドを実行してください
  5. Ctrl + 'a'と入力し、CtrlとAを放し、 'd'を押してScreenセッションを切断します。

セッションはバックグラウンドで引き続き実行されます。ログアウトしてSSHセッションを完全に閉じても同じです。

エンタープライズLinux(centosなど)を使用している場合は、yumを使用してディストリビューションのパッケージストアからscreenをインストールできます。

yum -y install screen

Debian ベースのオペレーティングシステムを使用している場合は、以下を試してください。

apt-get install screen

インストールが完了したら、screenと入力して新しいスクリーンセッションを開始します。

[user@localhost ~]$screen

注:これにより画面が消去され、新しいセッションが開始されます。

次のコマンドを実行してください。

[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を使用して、分離されたscreenセッションを表示できます。

[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

関連情報