web-dev-qa-db-ja.com

vsftpdバージョンをシェル変数に入れるにはどうすればよいですか?

Vsftpdバージョンをシェル変数に入れたい。私はそれを簡単にコンソールに入れることができます:

# vsftpd -version
vsftpd: version 2.2.2

また、他の多くの情報を変数に入れることができます:

# i=`bash --version 2>&1 | head -n1`; echo "=$i=";
=GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)=

(出力は「=」記号の間にあることに注意してください)。この単純な方法は、vsftpdでは機能しません。

# i=`vsftpd -version 2>&1`; echo "=$i=";
vsftpd: version 2.2.2
==

ここでは$ iが ""であることに注意してください。

私は何が間違っているのですか?

3
Putnik

興味深いことに、私のvsftpdはversino文字列をstdinに書き込みます。したがって、おそらくstdinからstdoutへのかなり珍しいリダイレクトを行う必要があります。

_i=`/usr/sbin/vsftpd -version 0>&1`
_

これを見つける方法:straceで実行し(rootとして実行する必要があります)、文字列を確認します。私の場合、ログは次のように終了します:

_$ strace /usr/sbin/vsftpd -version
...
brk(0)                                  = 0x7f835332d000
brk(0x7f835334e000)                     = 0x7f835334e000
write(0, "vsftpd: version 3.0.2\n", 22) = 22
exit_group(0)                           = ?
+++ exited with 0 +++
_

write()の最初の引数は、ファイル記述子です(0/1/2はそれぞれstdin/stdout/stderrを表します)。

5
peterph

コマンド vsftpd -vはstdinを使用するため、通常の方法では出力を取得できません。

私は通常、FTPポートから応答を取得するだけです。とにかくローカルでのみFTPを許可します。

echo "bye" | nc localhost 21

1
Ryan Burnette