Назад | Перейти на главную страницу

Ожидайте, что сценарий отлично работает автономно, а не от сценария bash

Я запускаю сценарий ожидания, который при входе на сервер проверяет, работает ли iptables, и возвращает файл журнала статуса. Существует также файл хоста со списком серверов и паролем, ожидается, что он вызывается из сценария оболочки, который отправляет правильный параметр; Запуская эти параметры индивидуально, я тоже могу выполнить ожидаемый скрипт, но он просто не работает в тандеме. хост-файл ниже:

cat hostfile
10.20.52.167|abcdef
10.20.52.138|zyxwvu

исполняемый сценарий оболочки:

cat iptables
#! /bin/bash
#!/usr/bin/expect -f
while read line
do
ipaddress=`echo $line | awk -F'|' '{print $1}'`
password=`echo $line | awk -F'|' '{print $2}'`
echo "./testcase_3 $ipaddress \"$password\" "
sleep 5
done < hostfile

И, наконец, сценарий ожидания:

cat testcase_3
#!/usr/bin/expect -f
#! /bin/bash

set timeout 60
set host [lindex $argv 0]
set password [lindex $argv 1]
log_user 1
set user subhasish
set logfile output.txt
foreach host $host password $password {
spawn ssh $user@$host
expect "*?assword:*"
send -- "$password\r"
sleep 2
expect "$"
send -- "sudo su\r"
expect -gl {*password for subhasish:*}
send -- "$password\r"
expect "#"
send -- "service iptables status\r"
log_file /home/subhasish/output.log
expect "#"
log_file
}
send -- "exit\r";
send -- "exit\r";
exit 0

Я понятия не имею, где что-то не так, пожалуйста, помогите. Сценарий iptables отправляет аргумент типа "./testcase_3". ... "******" ", который, если я запускаю в командной строке, работает, как ожидалось, путем создания output.log. Однако ничего не происходит, если я запускаю сценарий iptables напрямую ...

Трудно сказать, потому что, когда вы пишете, iptables не вызывает ожидаемый сценарий. Чтобы отладить ожидаемый сценарий, добавьте его вверху: exp_internal 1

Поскольку команда чтения оболочки может захватывать несколько слов, если указан правильный разделитель полей, я бы написал сценарий bash следующим образом:

while IFS='|' read ipaddress password; do
    echo "./testcase_3 $ipaddress \"$password\""
    ./testcase_3 "$ipaddress" "$password"
    sleep 5
done < hostfile