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

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

我想将 vsftpd 版本放入 shell 变量中。我可以轻松地将其发送到控制台:

# 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 是“”。

我究竟做错了什么?

答案1

有趣的是,我vsftpd将 versino 字符串写入stdin。因此,您可能需要对stdinto进行相当不寻常的重定向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)。

答案2

该命令vsftpd -v使用标准输入,因此您无法以正常方式获取输出。

我通常只是从 FTP 端口获取响应。无论如何,我只允许本地 FTP。

echo "bye" | nc localhost 21

相关内容