リモートアクティブ端末でコマンドを実行する

リモートアクティブ端末でコマンドを実行する

PID 6350を使用して端末エミュレータ(T1)を開くとしましょう。

別の端末(C1)で次のコマンドを入力します。

echo "ls\n" > /proc/6350/fd/0

これにより、lsT1 に新しい行が書き込まれますが、実行されません。なぜ?

cat|bash私もwithを試してみましたが、echo "ls\n" > /proc/catid/fd/0まだ実行されていません。

コマンドを他の端末にエコーしてコマンドを実行するにはどうすればよいですか?

考えられる答え:

$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;

この場合、端末に直接書き込むことはできません(すべては、コマンド(C1)がその端末に表示するのと同じ方法で表示されます。

答え1

ttyecho他の端末(tty / pts)にコマンドを送信し、そのコマンドを実行できるコマンドラインユーティリティがあります。

sudo ttyecho -n /dev/pts/5 ls

望むより:コマンドまたはデータを別の端末に送信するユーティリティ(tty / pts)

また見なさい:ttyechogithubのソースコード

もう一つの興味深いttyコマンドは、selectortty入力バッファを更新するコンソールのリアルタイムインタラクティブパターンマッチングです。

# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)

望むより:セレクタ - コンソールの動的検索

答え2

/dev/pts/X/proc/6350/fd/0(、1対応するシンボリックリンクのみ)への書き込みを実行すると、2プロセス(または適切に分岐したサブプロセスの1つ)が何かを出力したときに発生するのとまったく同じです6350。つまり、端末に書き込みます。

試してみると読むそのデバイス(cat < /dev/pts/X)で奇妙なことが起こります。元のシェルに入力した内容が表示されます。 (ほとんど最初の新しい行を入力した後にのみ可能です。ターミナルプログラム(xtermまたは使用中のプログラム)がいくつかの行バッファリングを実行し、ブロックされたシェルがその6350部分を取得するreadようです。そうではないかもしれません。

問題は、デバイスが読み書きするときにデバイスを使用する他のシェルと通信しないことです。たとえば、端末エミュレータと話していますxterm。端末エミュレータだけがこのチャネルにデータ(シェルから読み取ったデータ)を挿入できます。シェルで作成した内容はすべて端末に送信されます。 2番目のシェルをインストールしても、この内容は変わりません。

プロセスにコマンドを挿入するには、6530ターミナル(X11アプリケーションでも何でも)を介して実行する必要があります。

おすすめの本:「ターミナル」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか?

関連情報