Além disso, seu (exemplo?) cat
e awk
são inúteis e você não precisa dos testes echo|cut
e testes repetidos.
Após esclarecer que você precisa digitar a (s) senha (s) para os sudos remotos, você precisa ambos deixar ssh
usar a entrada do terminal e especificar -t
para encaminhar essa entrada como um PTY. Este é basicamente um dupe de SSH faz com que o loop while pare , embora você não atingiu o mesmo sintoma.
Método 1: redireciona (ou canaliza) stdin para o loop, mas redireciona-o de volta para ssh
while read inst type serial; do
case ${inst#*-} in
(DIF1) ssh </dev/tty -t user@host1 "sudo blah";;
(DIF2) ssh </dev/tty -t user@host2 "sudo blech";;
# more as needed
esac
done <alldata
# or cat/awk/whatever | while read ... done
Método 2: use um número de unidade diferente (não stdin) para alldata
while read <&3 inst type serial; do
case ${inst#*-} in
(DIF1) ssh -t user@host1 "sudo blah";;
(DIF2) ssh -t user@host2 "sudo blech";;
# more
esac
done 3<alldata
# or while read ... done 3< <(cat/awk/whatever) with zsh/bash
O método 3 é usar um loop for
(que você nem mesmo fez o seu Q dizer), que lê seus argumentos sem nenhum canal. Para o seu Q original, que só usou um campo, é fácil:
IFS='
' # split on newline only
set -o noglob # disable globbing
for inst in $(awk '{print $1}' alldata); do
# as for method 2
done
mas a sua edição diz que você deseja usar pelo menos um outro campo para precisar de algo mais feio como:
IFS='
' # split on newline only
set -o noglob # disable globbing
for line in $(awk '{print $1":"$2":"$3}' alldata); do
IFS=:; set -- $line; inst=$1; serial=$3;
# as before
done