2014-01-08 29 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」命令創建日誌文件,並且數據位於日誌文件中。

謝謝你幫助過我和他們的時間。

賞識和美好的一天。