Передача нескольких переменных из Bash Script в Expect Script - PullRequest
0 голосов
/ 12 июня 2019

Я пытался получить сценарий ожидающего / bash, который может прочитать каждую строку файла CSV и получить как адрес хоста, так и пароль; поскольку все они различны для каждого MikroTik, к которому я пытаюсь получить доступ.

Недавно я отправил файл auto.rsc на несколько тысяч маршрутизаторов MikroTik, которые используются в качестве решения для жилых помещений. Этот файл заполнил жесткий диск (у него было сканирование IP, которое создало журнал, который сумел сделать документ). Это не позволяет мне отправлять дополнительные файлы auto.rsc для очистки журналов, так как нет свободного места.

Решением, которое я придумал, было использование ожидающего сценария для входа в систему и удаления файла auto.log. Это было успешно с моим сценарием RSA.

set timeout 3
set f [open "dynuList.txt"]
set dynu [split [read $f] "\n"]
close $f

foreach dynu $dynu {
spawn ssh -o "StrictHostKeyChecking no" -i mtk4.key admin+t@$dynu
expect {
"> " { send "\:do \{ file remove push.auto.log \} on-error\=\{ \[\] \}\r" }
"Connection refused" { catch {exp_close}; exp_wait; continue }
eof { exp_wait; continue }
}
expect ".*"
close
wait
}

Сценарий, с которым у меня возникают проблемы, выглядит следующим образом:

n=`wc -l hostPasswordDynuList.csv | awk '{print$1}'`
i=1
while [ $i -le $n ]
do
host='awk -F "," 'NR==$i {print $1}' hostPasswordDynuList.csv'
password='awk -F "," 'NR==$i {print $2}' hostPasswordDynuList.csv'
./removeLogExpect.sh $host $password
i=`expr $i + 1`
done

Который должен передать переменные этому ожидаемому скрипту

#!/usr/bin/bash/expect -f
set timeout 3
set host [lindex $argv 0]
set password [lindex $argv 1]

spawn ssh -o "StrictHostKeyChecking no" admin+t@$host
expect {
"password: " { send $password"\r" }
"Connection refused" { catch {exp_close}; exp_wait; continue }
eof { exp_wait; continue }
}
expect {
".*" { send "\:do \{ file remove push.auto.log \} on-error\=\{ \[\] \}\r" }
}
expect ".*"
close
wait

Я надеялся, что сценарий сможет подключиться, а затем войти в систему к каждому MikroTik, для которого не настроены ключи RSA, а затем к команде для очистки файла auto.log. В нынешнем виде сценарий, похоже, не передает переменные ожидаемой половине вообще. Любая помощь будет оценена.

1 Ответ

2 голосов
/ 12 июня 2019

Ожидается, это расширение языка Tcl, который является полнофункциональным языком программирования: он может читать файлы и анализировать разделенные запятыми поля. Нет необходимости в неэффективном сценарии оболочки для многократного вызова ожидаемой программы

#!/usr/bin/bash/expect -f
set timeout 3

set file hostPasswordDynuList.csv
set fh [open $file r]

while {[gets $fh line] != -1} {
    lassign [split $line ,] host password

    spawn ssh -o "StrictHostKeyChecking no" admin+t@$host
    expect {
        "password: " { send $password"\r" }
        "Connection refused" {
            catch {exp_close}
            exp_wait
            continue 
        }
        eof {
            exp_wait
            continue 
        }
    }
    expect ".*" 
    send ":do { file remove push.auto.log } on-error={ \[\] }\r"
    expect ".*"
    exp_close
    exp_wait
}

close $fh

См. https://tcl.tk/man/tcl8.6/TclCmd/contents.htm для документации по встроенным командам Tcl.

Строка expect ".*", вероятно, не выполняет то, что вы думаете: стиль сопоставления с шаблоном по умолчанию - glob , поэтому .* ищет буквальную точку, за которой следует любое количество символов. Вы можете подумать о регулярном выражении «любой символ ноль или более раз», для которого вам нужно будет добавить опцию -re. Однако ключом к надежному ожидаемому коду является ожидание более конкретных шаблонов.

...