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

Posted

技术标签:

【中文标题】Telnet/Send/Expect - 自动从远程主机拉取日志【英文标题】:Telnet/Send/Expect - Automatically pulling logs from a remote host 【发布时间】:2013-01-03 06:48:38 【问题描述】:

我有一个简单的 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 管道输出等)。

谁能帮我解决这个问题?

谢谢。


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

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 列表的文本文件循环访问多个远程主机。

谢谢!

【问题讨论】:

从技术上讲,您应该使用\r 而不是\n 发送——\r 是回车,即“按回车” 【参考方案1】:

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

替换第一个',用替换最后一个。

【讨论】:

以上是关于Telnet/Send/Expect - 自动从远程主机拉取日志的主要内容,如果未能解决你的问题,请参考以下文章

GaussDB 200使用GDS从远端服务器导入数据

kickstart自动化安装

Cobbler自动化安装

PXE自动化装机

网络装机和kickstart自动处理

Centos 7 自动安装系统-pxe