我想将 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
。因此,您可能需要对stdin
to进行相当不寻常的重定向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