Tweet |
先日、ある方の一言、
「vsftpdのバージョン情報がファイルに記録できない」
から、ちょっと調査を開始。
*nux系(UNIX,Linux)OSの場合、プログラムからの出力(標準出力)
をファイルに記録する場合は、以下のように実行します。
program >output.txt
また、標準エラー出力と呼ばれる、標準出力とは別の部分に出力されている場合は、
program 2>output_err.txt
これら2つを一つのファイルに出力する場合は、以下のようにします。
program >output_dual.txt 2>&1
最後の2>&1は、2(標準エラー出力)に出力されたメッセージを
標準出力に流すことを指示しています。
結果として、標準出力先に指定した一つのファイルに、標準出力と標準エラー出力の
両方のメッセージが記録されます。
これらは、Windowsのコマンドプロンプトでも同様に動作するようです。
(Windows7しか確認していませんが・・・)
しかしながら、vsftpdでバージョン情報を取得しようと、以下のコマンドを入力しました。
vsftpd -v >vsftpd_ver.txt 2>&1
しかし、コンソールにバージョン情報が出力されてしまい、ファイルには何も記録されません。
これはどういうことか。と、調査を開始しました。
まずは出力先を変更して確認。
vsftpd -v >vsftpd_ver.txt 3>&1
vsftpd -v >vsftpd_ver.txt 4>&1
:
vsftpd -v >vsftpd_ver.txt 10>&1
しかし、どれも同じで記録されません。
そこで、ふと思いました。「0は?」と。
で、以下のコマンドを発行しました。
vsftpd -v >vsftpd_ver.txt 0>&1
すると、見事にファイルにバージョン情報が記録されました。
もちろんコンソールには何もメッセージが出ていません。
そこで、さらに調査するため、vsftpdのソースを入手。
main関数から順番に追っかけて行ったところ、バージョン情報に関するメッセージは、
ファイルハンドル0に対して出力されていました。
そこで、ファイルハンドル0とは何ぞや?と調べたところ、
なんと「標準入力(stdin)」に対して出力されていたのです。
これでは出力先0をリダイレクトしないとファイルに記録されませんね。
ただ、標準入力に出力するこの状態、何か不具合が起こりそうで怖く感じます。
この内容を伝えたら、その方は代替案で対処したみたいですが・・・。
Comments:0
Trackbacks:0
- TrackBack URL for this entry
- https://pc-diary.com/movt_direc_post/mt-tb.cgi/1578
- Listed below are links to weblogs that reference
- vsftpdは一部の情報が標準入力から出力されるようです。 from PC破壊日記的ブログ