2014-01-08 32 views
0

我试图在后台运行多个使用shell脚本的expect实例,但实际发生的情况是,当shell脚本甚至终止时在运行shell脚本并期望在后台运行脚本之后。下面是两个脚本 -在后台通过shell脚本运行多个expect实例来收集日志

shell脚本 - shell_script.sh

#!/bin/bash 

echo "shell script" 

expect expect_script.sh abc1.com user_id password >> /var/logs/abc1.log & 
sleep 5 
expect expect_script.sh abc2.com user_id password >> /var/logs/abc1.log & 

Expect脚本 - expect_script.sh

#!/usr/bin/expect 
set timeout 20 
set ip [lindex $argv 0] 
set user [lindex $argv 1] 
set password [lindex $argv 2] 

spawn telnet $ip 

expect "User Access Verification" 
expect "Username:" 
send "$user\r" 
expect "Password:" 
send "$password\r"; 

expect eof 

我这是怎么执行 -

SH shell_script.sh &

此scrip的全部目的t是在后台运行期望脚本来收集日志,直到进程被终止。另一种选择是逐个运行每个expect脚本,但为了自动化并适应将来的请求,这些expect脚本必须使用shell脚本运行。

我不是这方面的专家,任何帮助都非常感谢。

非常感谢, Sirish。

+0

所以你telnet到一个设备,然后等待eof。在连接关闭之前,空闲的telnet会话保持多久? –

+0

那么,这个telnet会话永远不会关闭,直到进程被终止,这就是主机的配置方式。这些主机通过telnet端口发送数据,应该使用expect脚本将这些数据捕获到日志文件中。希望我很清楚。 – Sirish

回答

0

好的。在甲板上的手。我尝试了几种方法来执行一个在后台记录telnet输出的shell脚本,但后来发现这些选项不可行,因为 -

1>当您尝试在主脚本中执行子脚本/命令时,甚至作为后台进程(在命令末尾使用&),子进程将在主脚本退出/终止时终止。

2>您可能会尝试永远执行主脚本或以无限循环(错误选项:P)执行主脚本,但是telnet会话或通道无法作为后台进程运行,因为操作系统杀死了与telnet会话关联的通道。我对此没有太多细节,但这是我实验的输出之一。

现在到了解决方案..敲我的头,打破我周围的墙壁立方体后,这是我做它的工作 -

使用屏幕命令创建一个会运行一个用户登录会话的会话和下面是我的脚本的工作副本 -

#!/bin/bash 

screen -dmS "abc-alpha-32" 
sleep 2 
echo 'running script command in session..' 
screen -S abc-alpha-32 -p abc-alpha-32 -X stuff "script -f /home/user12/scripts/abc-alpha-32.log $(printf \\r)" 
sleep 2 
echo 'running expect command in session..' 
screen -S abc-alpha-32 -p abc-alpha-32 -X stuff "expect /home/user12/scripts/master_dian.sh abc-alpha-32.cisco.com user_id password $(printf \\r)" 

**注意:参数“-p ABC-α-32”(在上面的屏幕命令)是强制性地告诉屏幕命令到屏幕上,您是送命令。

master_dian.sh -

这个脚本所有这些命令使用期望替换用户ID和密码。下面是一个工作副本 -

#!/usr/bin/expect 
set hostName [lindex $argv 0] 
set userName [lindex $argv 1] 
set password [lindex $argv 2] 

spawn telnet $hostName 

expect "User Access Verification" 
expect "Username:" 
send "$userName\r" 
expect "Password:" 
send "$password\r"; 
interact 

就是这样。这些远程登录会话在新会话的后台运行,每个会话都将使用“script -f”命令创建日志文件,并且数据位于日志文件中。

谢谢你帮助过我和他们的时间。

赏识和美好的一天。