私はAlpine Linuxで作業していますが、シェルの次の動作を理解できませんsh
。
/ # vsftpd /etc/vsftpd/vsftpd.conf > /dev/null
500 OOPS: bad bool value in config file for: hide_ids
/ # vsftpd /etc/vsftpd/vsftpd.conf 2> /dev/null
500 OOPS: bad bool value in config file for: hide_ids
メッセージはどこに印刷されますか?はいstdout
、それともstderr
?
答え1
ソースはvsftpd
定数をVSFTP_COMMAND_FD
数値 0 として定義します。これは間違ったファイル記述子が書かれたものです。
$ grep -F VSFTP_COMMAND_FD defs.h
#define VSFTP_COMMAND_FD 0
どんなに奇妙に見えるかもしれませんが、コードは標準にエラーメッセージを書いています。入力する小川。
void
bug(const char* p_text)
{
/* Rats. Try and write the reason to the network for diagnostics */
vsf_sysutil_activate_noblock(VSFTP_COMMAND_FD);
(void) vsf_sysutil_write_loop(VSFTP_COMMAND_FD, "500 OOPS: ", 10);
(void) vsf_sysutil_write_loop(VSFTP_COMMAND_FD, p_text,
vsf_sysutil_strlen(p_text));
(void) vsf_sysutil_write_loop(VSFTP_COMMAND_FD, "\r\n", 2);
vsf_sysutil_exit(2);
}
テスト:
$ ./vsftpd >/dev/null
500 OOPS: vsftpd: must be started as root (see run_as_launching_user option)
$ ./vsftpd 2>/dev/null
500 OOPS: vsftpd: must be started as root (see run_as_launching_user option)
$ ./vsftpd </dev/null
$
したがって、/dev/null
アプリケーションにリダイレクトするとエラーがなくなります。また、それを使用して、0>/dev/null
アプリケーションがその特定のファイル記述子に送信された出力を削除することを意図することもできます。
答え2
vsftpd
inetd
通常、クライアントのTCPコマンドソケットfd 0(stdin)を介して呼び出されます。
ここにステータスメッセージが記録されます。
次のことができます。
vsftpd configfile < /dev/null
役に立つことをするよりも消えるようにしてください。
答え3
まず、メッセージはシェルから出ません。hide_ids
これはシェル設定オプションではなくvsftpd設定オプションなので、シェルがそれを参照するすべてを印刷すると仮定する理由はありません。 (はい、違いがあり重要です。)
次に、vsftpdの起動時にstdoutとstderrの両方がリダイレクトされ、/dev/null
まだ表示されるため、メッセージが次に印刷されると仮定する必要があります。どちらもありません。
/dev/tty
一部のユーティリティは通常、現在の端末への新しいハンドルを明示的に開くことで、可能なリダイレクトを妨げることなくユーザー対話を必要とするタスクを実行します。これは、stdoutとstderrの両方がリダイレクトされても、SSHクライアントがパスワードを要求する方法です。
しかしここでもそうではありません。 〜のようにクサラナンダが答えた。、vsftpdはfdコマンド(VSFTP_COMMAND_FD
ソースコードで指定)に致命的なエラーを出力します。おそらく、同じfdを使用してコマンドを読み取ると推定され、fd 0として定義されます。標準入力。すべてのstdin、stdout、およびstderrは通常読み書き用に開かれているため、これは機能します。 Linuxでは、/proc/<pid>/fd
正常に起動するプロセスへのエントリー権限を見ると、これを確認できます。最も簡単な方法は次のとおりですls
。
$ ls -l /proc/self/fd
total 0
lrwx------ 1 ilkkachu ilkkachu 64 Jan 1 13:54 0 -> /dev/pts/18
lrwx------ 1 ilkkachu ilkkachu 64 Jan 1 13:54 1 -> /dev/pts/18
lrwx------ 1 ilkkachu ilkkachu 64 Jan 1 13:54 2 -> /dev/pts/18
lr-x------ 1 ilkkachu ilkkachu 64 Jan 1 13:54 3 -> /proc/8955/fd/
0、1、2がすべて表示され、rwx
読み書きモードで開きます。 (ここでこのビットが何を意味するのかわかりませんx
。)
答え4
stdout
.soにリダイレクトすることは/dev/null
できませんstdout
。これはとどまったstderr
。
この仮説をテストするにstderr
はに進みます。/dev/null