我正在尝试在后台使用shell脚本运行多个expect实例,但实际发生的情况是,即使在运行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_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&
此脚本的目的是在后台运行expect脚本,这些脚本将收集日志,直到进程被终止。另一种方法是一个接一个地运行每个expect脚本,但要自动化并适应近期的请求,这些期望脚本必须使用shell脚本运行。
我不是这方面的专家,非常感谢任何帮助。
非常感谢, Sirish。
答案 0 :(得分:0)
好的。在甲板上的手。我尝试了几种方法来执行一个在后台记录telnet输出的shell脚本,但后来发现这些选项是不可能的,因为 -
1>当您尝试在主脚本中执行子脚本/命令时,即使作为后台进程(使用&在命令末尾),子进程也会在主脚本退出/终止时终止。
2 - ;您可以尝试永久执行主脚本或在无限循环中执行主脚本(错误选项:P),但是telnet会话或通道不能作为后台进程运行,因为操作系统会终止与telnet会话关联的通道。我没有太多关于此的细节,但这是我实验的结果之一。
现在出现了解决方案..在敲击我的头部并在我的立方体周围打破墙壁后,这就是我的工作原理 -
使用screen命令创建一个会像用户登录会话一样运行的会话,下面是我脚本的工作副本 -
#!/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-alpha-32'(在屏幕上方命令中)必须告诉屏幕命令您要向哪个屏幕发送命令。
master_dian.sh -
此脚本包含使用expect替换用户标识和密码的所有命令。以下是工作副本 -
#!/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
就是这样。这些telnet会话在后台运行在新会话中,每个会话将使用“script -f”命令创建一个日志文件,并且数据位于日志文件中。
感谢那些帮助我和他们的时间的人。
赞赏和美好的一天。!