web-dev-qa-db-ja.com

stdout、stderrを/ dev / ttyに再ルーティングする方法

リモートサーバーにSSH接続したところ、bashで実行しようとしているすべてのコマンド/プロセスのstdoutstderrがどこかにリダイレクトされていることがわかりました。だから、私は次の質問を受けました

検出する方法:

1)Linuxで再ルーティングされているファイルstdoutstderrはどれですか?

そして

2)そして、デフォルトでstdoutstderrを/ dev/ttyにどのように再ルーティングしますか?

前もって感謝します。

12
Sergey

(2)で要求したことを文字通り実行する必要があるコマンドは次のとおりです。

exec >/dev/tty 2>&1

しかし、問題の分析は正しくないと思います。 ssh -v ...の出力を確認すると便利です(ここで、...は、元のsshコマンドで入力した引数です)。

11
zwol

コマンド:

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

stdout(ファイル記述子1)およびstderr(ファイル記述子2)として開いているファイルが表示されます。

8
caf

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

root@mammon:~# 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/
root@mammon:~# 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/
root@mammon:~# 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/
root@mammon:~#

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

1
Robbie Mckennie

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

説明させてください。

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

bash 2>&1 | tee /dev/tty2

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

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

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

ps ax | grep tee

これは次のようなものを出力します

tee /dev/tty2
1
Shiplu Mokaddim