このメッセージはどこに印刷されましたか? [コピー]

このメッセージはどこに印刷されましたか? [コピー]

私は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

vsftpdinetd通常、クライアントの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

関連情報