リモートサーバーにSSH接続したところ、bashで実行しようとしているすべてのコマンド/プロセスのstdout
とstderr
がどこかにリダイレクトされていることがわかりました。だから、私は次の質問を受けました
検出する方法:
1)Linuxで再ルーティングされているファイルstdout
、stderr
はどれですか?
そして
2)そして、デフォルトでstdout
とstderr
を/ dev/ttyにどのように再ルーティングしますか?
前もって感謝します。
(2)で要求したことを文字通り実行する必要があるコマンドは次のとおりです。
exec >/dev/tty 2>&1
しかし、問題の分析は正しくないと思います。 ssh -v ...
の出力を確認すると便利です(ここで、...
は、元のssh
コマンドで入力した引数です)。
コマンド:
ls -l /proc/$$/fd/{1,2}
stdout(ファイル記述子1)およびstderr(ファイル記述子2)として開いているファイルが表示されます。
最初の質問に対する答えは/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です。
これは、憧れのシェルが、別のコンソールをパラメーターとして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