2016-02-25 3 views
1

Я пытаюсь перебрать массив 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 

Любые вам советы будут оценены! Спасибо заранее!

+0

Benjamin W., thanks for edits. – LinenG

+0

Можете ли вы объяснить, почему вы закрываете spawn_id сразу после нереста? –

+0

Ну, правда. Я только положил его из-за того, что если я положил его после ** отправить - «$ PASSPHRASE \ r» ** он терпит неудачу с: spawn rpm --resign x86_64/myrpm0.rpm не может файл доступа x86_64/myrpm0.rpm отправить: spawn id exp4 не работает при запуске «отправить -« plain_passphrase_here! \ r » – LinenG

ответ

0

В вашем случае PLIST не является массивом, вам нужно преобразовать его в массив. Поместите следующую строку перед циклом for (строка 6)

PLIST=($PLIST) 
+0

Привет. На самом деле, я действительно пробовал это, не было большой разницы, поскольку я все еще не мог правильно распространять/устанавливать и использовать массив, чтобы ожидать. – LinenG

+0

Может быть, вы должен прокомментировать все содержимое внутри цикла for, а затем заменить его простой командой (например: echo), а затем проверить, работает ли цикл нормально – Waveter

1

Внутри ожидать,

  • вы получаете переменные окружения с $env(PASSPHRASE).
  • Вы уже находитесь в глобальном масштабе, поэтому global ::env является избыточным (на самом деле вдвойне избыточным с полной квалификацией ::env).

В Баше,

  • читать строки в массив вы могли бы сделать

    mapfile PLIST < <(find "$PPATH" -name "*.rpm") 
    
  • выйти из привычки использовать ALLCAPSVARNAMES, что вы можете получить неприятности, если вам случайно используйте «зарезервированное» имя переменной.

  • кажется странным использовать параметр чтения -e с -s - трудно редактировать что-то, чего вы не видите.
  • «массив» - это плохое имя переменной для элемента массива.
+0

Привет, Гленн! Спасибо за другой ваш ответ на мой вопрос. Я попытался сыграть с рекомендованным вами решением и почти преуспеть, цикл работает так же, как и переменные окружения. Хотя есть некоторые проблемы ... P.S. Я обновил начальную запись с новой версией скрипта и вывода. Благодаря! – LinenG

 Смежные вопросы

  • Нет связанных вопросов^_^