16

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

検出方法:

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

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

前もって感謝します。

4

4 に答える 4

16

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

exec >/dev/tty 2>&1

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

于 2012-01-24T22:22:32.893 に答える
9

コマンド:

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

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

于 2012-01-25T06:31:25.797 に答える
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。そして最後の例では、パイプlscat介してへの出力を送信しました。標準の入力ファイル記述子はこれを反映しています。私の知る限り、パイプのもう一方の端がどのプロセスにあるかを見つける方法はありません。lsすべての例で、読み取り用のハンドルを表す4番目のファイル記述子があります/proc/self/fd。この場合、実際にはにアクセスしているプロセスのPIDがどこにあるかへのシンボリックリンクである/proc/15537ためです。/proc/self/proc/pidpid/proc/self

于 2014-05-20T14:24:29.407 に答える
1

これは、憧れのシェルが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
于 2012-01-24T22:25:21.480 に答える