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


10

6350のPIDで開いているターミナルエミュレータ(T1)があるとします。

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

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

これによりls、T1に新しい行が書き込まれますが、実行されません。どうして?

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

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

可能な答え:

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

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



私はそれを読みましたが、あまり役に立ちません。
rvlander

1
それはあなたにそれをする方法を与えるように「有用」ではないかもしれませんが、それはあなたの質問に答えます:あなたはできません。達成しようとしている最終目標を教えて、別の方法があるかどうかを確認できます。
ケビン

できませんが、なぜ他の端末にテキストが表示されるのですか?
rvlander

シェルではなく、ターミナルインターフェイスにテキストを送信するためです。
ラッシュ

回答:


11

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

sudo ttyecho -n /dev/pts/5 ls

参照:コマンドまたはデータを他の端末に送信するユーティリティ(tty / pts)

ttyechogithubのソースコードも参照してください。

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

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

参照:セレクター-コンソールでの動的検索


残念ながら、ttyechogithub上のソースコードへのリンクが壊れているようです。ただし、代わりにgithub.com/osospeed/ttyechoで利用できるようになりました。
Wilson F

7

/dev/pts/X/proc/6350/fd/01および2それにシンボリックリンクである)への書き込みを発行すると、プロセス6350(または適切にフォークされたその子の1つ)が何かを出力するときに発生するのとまったく同じです:端末に書き込みます。

そのデバイスから読み込もうとすると(cat < /dev/pts/X)、ファンキーなことが起こります。元のシェルに入力したものが表示されるはずです。(おそらく、入力した最初の新しい行の後でのみ可能性があります-私は、ターミナルプログラム(xtermまたはあなたが使用しているもの)が行バッファリングを実行し、6350ブロックされたシェルreadがそのピースを取得すると思います。そうではなく、後続の読み取りを獲得しますが、これについては完全に間違っている可能性があります。)

重要なのは、そのデバイスから読み書きするとき、それを使用している他のシェルとは話していないということです。(xtermたとえば)端末エミュレータと話している。ターミナルエミュレータだけがそのチャネル(シェルが読み取るもの)にデータを挿入でき、シェルが書き込むすべての情報はターミナルに送られます。2番目のシェルを接続しても、それは変わりません。

コマンドをその6530プロセスに注入したい場合は、ターミナルを介してそれを実行する必要があります(それがX11アプリか他のものかどうかに関係なく)。

推奨読書:「ターミナル」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか?


1
興味深いことに、pts(cat /dev/pts/x、必要ありません<)から読み取ると、端末間で文字が厳密に交互に表示されます。
ケビン

リダイレクションを使用しなくても、ほとんど変化はありません。どちらの方法でも予測できない出力が得られます。
マット

興味深い、リンクをありがとう。そう/proc/6350/fd/0でSTDIN親にsimlinkあるprocess 6350ターミナルであるが。ウィンドウ付きアプリケーションでも同じだと思いますか?
rvlander
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.