如何将 vsftpd 版本放入 shell 变量?

Put*_*nik 4 io-redirection shell-script stdout output vsftpd

我想将 vsftpd 版本放入 shell 变量中。我可以轻松获得它的控制台:

# vsftpd -version
vsftpd: version 2.2.2
Run Code Online (Sandbox Code Playgroud)

我也可以将很多其他信息放入变量中:

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

(请注意输出在“=”符号之间)。这种简单的方法不适用于 vsftpd:

# i=`vsftpd -version 2>&1`; echo "=$i=";
vsftpd: version 2.2.2
==
Run Code Online (Sandbox Code Playgroud)

请注意这里的 $i 是 ""。

我究竟做错了什么?

pet*_*rph 5

有趣的是,我vsftpd将 versino 字符串写入stdin. 所以,你可能需要做的是相当不寻常重定向stdinstdout

i=`/usr/sbin/vsftpd -version 0>&1`
Run Code Online (Sandbox Code Playgroud)

如何找出这一点:运行它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 +++
Run Code Online (Sandbox Code Playgroud)

第一个参数write()是文件描述符(0/1/2 分别代表 stdin/stdout/stderr)。