Я пытаюсь перебрать массив Bash (список пакетов), а внутри цикла используют команды expect
для автоматизации интерактивных входов.Как перебрать массив Bash, используя ожидание внутри?
Сценарий должен задать несколько вопросов, чтобы предоставить пароль и путь, в котором хранятся пакеты rpm. После этого массив формируется из списка и петлителя для подписи пакетов rpm (с использованием кода для ввода автоматической кодовой фразы) и отправки пакетов на RedHat Satellite.
Петля не работает, и я не могу правильно экспортировать массив в expect
.
`` `Обновленный код после рекомендаций Гленна.
#/bin/bash
read -srep $'Please, insert passphrase:\n\n' PASSPHRASE
read -rep $'Please, provide a path for your package(s) being signed and pushed:\#n\n' PPATH
mapfile PLIST < <(find "$PPATH" -name "*.rpm")
export PASSPHRASE PLIST
for package in "${PLIST[@]}"
do
echo "$package"
export package
/usr/bin/expect<<EOF
set force_conservative 0 ;
;
set filename [lindex $argv 0]
set timeout -1
spawn rpm --resign $::env(package)
close $spawn_id
expect "*phrase:"
send -- "$PASSPHRASE\r"
expect eof
EOF
done
unset PASSPRASE
И вот что я получаю:
spawn rpm --resign x86_64/myrpm9.rpm
expect: spawn id exp4 not open
while executing
"expect "*phrase:""
spawn rpm --resign x86_64/myrpm1.rpm
expect: spawn id exp4 not open
while executing
"expect "*phrase:""
UPDATE 2: я продолжал работать над этим, чтобы попытаться ее исправить. Для удобства я жестко закодировал переменные bash. Я почти понял это, очевидная не работающая вещь все еще переменная среды от bash. Ожидающий скрипт интерпретирует его правильно, но spawn как-то дает 'не может получить доступ к файлу' (что означает, что он не может найти файл), если я заменю переменную именем файла, она работает.
#/bin/bash
PASSPHRASE="IamPass"
PPATH="/home/user/strcompat-debuginfo-0.9.2.7-1.x86_64.rpm"
mapfile PLIST < <(find "$PPATH" -name "*.rpm")
export PASSPHRASE PLIST
for package in "${PLIST[@]}"
do
export package
/usr/bin/expect -d <<EOF
set force_conservative 0 ;
set filename [lindex $argv 0]
set timeout -1
spawn rpm --resign $::env(package)
expect { "*phrase:"
{ send -- "$PASSPHRASE\r"; incr i; exp_continue }
eof exit
}
EOF
done
Выход в режиме отладки:
[[email protected] ~]$ ./script.sh
expect version 5.44.1.15
argv[0] = /usr/bin/expect argv[1] = -d
set argc 0
set argv0 "/usr/bin/expect"
set argv ""
executing commands from command file
spawn rpm --resign /home/user/strcompat-debuginfo-0.9.2.7-1.x86_64.rpm
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {18487}
expect: does "" (spawn_id exp4) match glob pattern " "*phrase:"\n\t{ send -- "IamPass\r"; incr i; exp_continue }\n\t# close \n\teof exit\n\t"? no
cannot access file /home/user/strcompat-debuginfo-0.9.2.7-1.x86_64.rpm
expect: does "cannot access file /home/user/strcompat-debuginfo-0.9.2.7-1.x86_64.rpm\r\n\r\n" (spawn_id exp4) match glob pattern " "*phrase:"\n\t{ send -- "IamPass\r"; incr i; exp_continue }\n\t# close \n\teof exit\n\t"? no
expect: read eof
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "cannot access file /home/user/strcompat-debuginfo-0.9.2.7-1.x86_64.rpm\r\n\r\n"
Нормальный выход:
[[email protected] ~]$ ./script.sh
spawn rpm --resign /home/user/strcompat-debuginfo-0.9.2.7-1.x86_64.rpm
cannot access file /home/user/strcompat-debuginfo-0.9.2.7-1.x86_64.rpm
[[email protected] ~]$ echo $?
0
Любые вам советы будут оценены! Спасибо заранее!
Benjamin W., thanks for edits. – LinenG
Можете ли вы объяснить, почему вы закрываете spawn_id сразу после нереста? –
Ну, правда. Я только положил его из-за того, что если я положил его после ** отправить - «$ PASSPHRASE \ r» ** он терпит неудачу с: spawn rpm --resign x86_64/myrpm0.rpm не может файл доступа x86_64/myrpm0.rpm отправить: spawn id exp4 не работает при запуске «отправить -« plain_passphrase_here! \ r » – LinenG