Это то, для чего предназначен select
.
PS3="Would you like to input some text? <Y/N> ]"
select choice in "Y" "N"; do
case $choice in
"Y")
echo -n "Please input some text >"
read input
echo "$input"
break
;;
"N")
echo "Very well."
break
;;
*)
echo "Invalid response."
;;
esac
done
Встроить Expect в сценарии оболочки непросто. Я приведу вам пример с использованием инструмента sexpect .
Код:
[STEP 101] # cat foo.xsh
user=foo
passwd=foobar
while read host; do
echo ==== $host ====
export SEXPECT_SOCKFILE=~/tmp/host-$host-$$.sock
sexpect spawn \
ssh -o StrictHostKeyChecking=no \
-o ConnectTimeout=5 \
-o UserKnownHostsFile=/dev/null \
-t \
$user@$host bash --norc
sexpect expect -i password:
sexpect send -enter "$passwd"
sexpect expect -re 'bash-[.0-9]+[#$] $'
sexpect send -enter "sudo date"
sexpect expect -i -re "password( for [^[:blank:]]+):"
sexpect send -enter "$passwd"
sexpect expect -re 'bash-[.0-9]+[#$] $'
sexpect send -enter exit
sexpect wait
done < hosts-file
Тестирование:
[STEP 102] # cat hosts-file
host1
host2
[STEP 103] # bash foo.xsh
==== host1 ====
foo@host1's password:
bash-4.4$ sudo date
[sudo] password for foo:
Thu Nov 29 14:28:39 CST 2018
bash-4.4$ exit
exit
Connection to host1 closed.
==== host2 ====
foo@host2's password:
bash-4.4$ sudo date
[sudo] password for foo:
Thu Nov 29 14:28:40 CST 2018
bash-4.4$ exit
exit
Connection to host2 closed.
[STEP 104] #