Telnet / Send / Expect - 自动从远程主机提取日志

时间:2013-01-19 19:17:20

标签: bash tcl send telnet expect

我使用了一个简单的BASH脚本,它将.esh脚本发送到远程主机。例如,我知道主机的用户名和密码是什么,所以我的脚本执行以下操作:

expect login:
send root\n
expect Password:
send abc123\n
expect "# "

因此,这会自动以密码为root的用户abc123将我登录到远程主机。

我现在正尝试发送一个BASH风格的单行for循环来从主机上的某些日志文件中提取一些指标,即:

send 'for i in /var/log/example/*.txt; do echo $i; cat $i | grep error ; done \n'

然而,这失败了:

# can't read "i": no such variable
    while executing
send 'for i in /var/log/example/*.txt; do echo $i; cat $i | grep error ; done \n'

我已经阅读了一些类似的帖子,但我没有发现任何与此相似的案例。一旦我弄清楚如何实现这一点,我可能会包含更多命令行命令来优化日志文件的输出(即:更多bash临时变量,通过awk管道输出等)。 / p>

有人可以帮我解决这个问题吗?

谢谢。


编辑:根据提供的答案,我将脚本更改为以下内容,它就像一个魅力:

expect login:
send root\n
expect Password:
send abc123\n
expect "# "
send { for i in /var/log/example/*.txt; do echo $i; cat $i | grep error ; done }
send "\n"
send exit

这将登录到远程主机,将一些有价值的指标打印到控制台,然后退出telnet。我现在可以在本地主机上使用bash脚本通过包含主机名/ IP列表的文本文件循环遍历多个远程主机。

谢谢!

1 个答案:

答案 0 :(得分:2)

单引号不用于引用Tcl,它们是普通字符。如果你想要反斜杠,命令和变量扩展,请使用双引号,如果不需要,请使用花括号。

将第一个'替换为{,将最后一个替换为}