如何从Bash中获取Telnet命令的输出?

3
我正在尝试从Linux获取运行在我的Windows机器上的进程列表,但是当我在脚本中执行时没有输出。如果我手动使用telnet并使用pslist命令,则可以获取完整的进程列表,但在我的脚本中则不行。
以下是bash脚本(省略变量):
( echo open ${host}
sleep 1
echo ${user}
sleep 3
echo ${pass}
sleep 1
echo pslist
sleep 2
 ) | telnet

我只需使用bash pslist.sh来调用它,输出结果如下:

telnet> Trying ip_address...
Connected to ip_address.
Escape character is '^]'.
Welcome to Microsoft Telnet Service 

login: my_loginmy_passwordpslistConnection closed by foreign host.

我做错了什么?

1
尝试在每个 echo 命令后加上 \r 字符,像这样:echo -e "${user}\r" - nsilent22
echo存在许多可移植性问题,不应与选项标志一起使用。考虑使用printf代替:printf 'name: %s\n' "$name"。 http://wiki.bash-hackers.org/commands/builtin/echo | http://cfajohnson.com/shell/cus-faq.html#Q0b | http://www.in-ulm.de/~mascheck/various/echo+printf - Rany Albeg Wein
我建议使用expect来编写telnet脚本。你可以在这里了解并下载它:http://expect.sourceforge.net/ 这里有一个使用它的示例telnet脚本:https://dev59.com/pGsz5IYBdhLWcg3wlY-9 - John Hascall
@nsilent22 谢谢,就是这个 :) 你能把它发布为答案吗? - Baptiste Wicht
@BaptisteWicht:完成。 - nsilent22
2个回答

3
telnet 是一个著名的难以编写脚本的工具。如果你在命令之间添加更长时间的 sleep,则可能会增加成功率。
更好的方法是切换到一个适合脚本编写的客户端,比如 netcat(又名 nc)。最好的方法是在你的 Windows 系统上安装一个 SSH 服务器(也许只允许内网访问),并设置无密码验证。然后你可以直接使用 ssh user@ipaddress pslist 命令。

3

每个echo命令都应该以\r字符结尾,像这样:echo -e "${user}\r"


1
为了可移植性,printf 绝对优于 echo,无论是否使用 -e 以及是否使用转义码(在某些方言中支持但在其他方言中不支持)。使用 printf,所有这些都得到了正确的标准化。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接