2013-01-19 49 views
1

我有一个简单的BASH脚本,我用它发送一个.esh脚本到远程主机。例如,我知道用户名和密码是主机,所以我的脚本执行以下操作:Telnet /发送/期望 - 从远程主机自动拉日志

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管道输出等)。

任何人都可以帮我解决这个问题吗?

谢谢。


编辑:按照所提供的答案,我改变了我的脚本为以下,和它的工作就像一个魅力:

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

从技术上讲,你应该用'\ r'而不是'\ n'发送 - '\ r'是回车,即.e. “打入” –

回答

2

单引号不用于引用Tcl,它们是正常字符。如果您需要反斜杠,命令和变量扩展,请使用双引号,如果不需要,请使用大括号。

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