2012-01-24 9 views
11

私はちょっとリモートサーバーにsshして、bashで実行しようとしているすべてのコマンド/プロセスのstdoutstderrがどこかにリダイレクトされていることがわかりました。検出方法 だから、私は次しまっ質問stdout、stderrを/ dev/ttyに戻す方法

1)ファイルstdoutstderrは、Linuxで再ルーティングbeeingてますか?

2)そして、どのバックは/ dev/ttyのにデフォルトstdoutstderrによって再ルーティング?

ありがとうございます。あなたが求めて文字通り何をすべき

+0

どうやってそれを見つけましたか? –

+0

コマンドを入力するだけで、STDOUTとSTDERRに出力する必要があります。 – Sergey

+0

.bashrcに関連するものはありますか? –

答えて

10

コマンド(2)

exec >/dev/tty 2>&1 

です。しかし、私は、問題のあなたの分析が間違っていると思われるで。 ssh -v ...の出力(...は元のsshコマンドで入力した引数です)を見ると便利です。

+0

これをフォーク管理ループに追加すると、stdoutをリセットする手口ができました。私はsshingしていました、スクリーンを走らせていました。そして、改行が復帰せずに次の行に飛び越すような改行が始まったperlスクリプトにパッチを当てるフォークを実行しています。このコマンドを指摘するためのMucho gracias。 –

1

あなたの憧れのシェルがteeコマンドへのパイプで開始され、別のコンソールをパラメータとして使用する場合にのみ実行できます。

私を説明しましょう。

/dev/tty1にログインしていて、ほかの誰かがログイン中の場合は/dev/tty2です。次のコマンドでシェル(bash)を起動すると、STDOUT/STDERRはすべて別のシェル(この場合は/dev/tty2)に再ルーティング/コピーされます。

bash 2>&1 | tee /dev/tty2 

だから、/dev/tty2に座っている人はあなたのすべてのアクティビティを見ることになります。

誰かがログインするシェルが/bin/bashの代わりに/bin/bash 2>&1 | tee /dev/tty2の場合、ログインするたびに発生しますが、ログインシェルをこのように設定することはできません。

誰かがあなたのシェルのすべての出力を再ルーティングする場合は、teeがバックグラウンドで実行されているかどうかをチェックするだけで確認できます。

ps ax | grep tee 

tee /dev/tty2 
8

のようなこの意志の出力に何かコマンド:

ls -l /proc/$$/fd/{1,2} 

は標準出力(ファイルディスクリプタ1)とstderr(ファイルディスクリプタ2)のように開いているファイルを紹介します。

+0

非常に良い!任意のアイデアをどのように関連付けるか?: '1 - > pipe:[16418291]' pid? –

+0

私はちょうど/ procに、これで他のPIDを見つけました! '0 - > pipe:[16418291]' –

1

最初の質問に対する回答は/proc/self/fdです。これには、bashインスタンスが接続されているファイル(またはその他のもの、パイプ、ソケットなど)へのシンボリックリンクが含まれています。

[email protected]:~# ls -l /proc/self/fd 
total 0 
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15529/fd/ 
[email protected]:~# ls -l /proc/self/fd < /dev/null 
total 0 
lr-x------ 1 root root 64 May 21 02:18 0 -> /dev/null 
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15536/fd/ 
[email protected]:~# ls -l /proc/self/fd | cat 
total 0 
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3 
l-wx------ 1 root root 64 May 21 02:18 1 -> pipe:[497711] 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15537/fd/ 
[email protected]:~# 

最初の例では、(それぞれ標準出力、入力、およびエラーである)第3のファイル記述子私の疑似ターミナル/dev/pts/3へのすべてのポイントを見ることができます。 2番目の例では、入力を/dev/nullにリダイレクトしたので、標準入力ファイル記述子は/dev/nullを指しています。そして、最後の例では、lsの出力をパイプを通してcatに送りました。そして、標準の入力ファイル記述子にこれが反映されています。私が知る限り、どのプロセスにパイプのもう一方の端があるかを見つける方法はありません。すべての例では、lsが読み取るために持っているハンドルを表す第4のファイル記述子が/proc/self/fdです。この場合、/proc/selfは実際に/proc/pidへのシンボリックリンクであるため、/proc/15537と表示されます。pidは、/proc/selfにアクセスするプロセスのPIDです。

関連する問題