Как я могу получить версию 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 находится здесь.

Что я делаю не так?

Интересно, что мой 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 соответственно).

Команда vsftpd -v использует stdin, поэтому вы не можете получить выход в обычном режиме.

Обычно я просто получаю ответ от FTP-порта. В любом случае я разрешаю только FTP.

echo "bye" | nc localhost 21