私は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
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セッションを正常に開きます。
- インストール画面。 (まだインストールしていない場合)
- 新しいスクリーンセッションを開始してください。 (画面を入力してEnterを押します)
- コマンドを実行してください
- 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