リモートサーバーに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
すべての例で、読み取り用のハンドルを表す4番目のファイル記述子があります/proc/self/fd
。この場合、実際にはにアクセスしているプロセスのPIDがどこにあるかへのシンボリックリンクである/proc/15537
ためです。/proc/self
/proc/pid
pid
/proc/self
これは、憧れのシェルが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