não pode comandar remotamente com o comando ssh over for loop

0

Estou tentando executar um loop for que é parecido com isto

cat  all_data |
  awk '{print $1 " "$2" " $3}'  |
  while read inst type serial ; do
    echo $inst
    if [ 'echo ${inst} | cut -d '-' -f2' = H3 ]; then
      ssh  -t  username@hostname3 "sudo ls"
    elif [ 'echo ${inst} | cut -d '-' -f2' = H2 ] ; then
      ssh  -t  username@hostname2 "sudo ls"
    elif [ 'echo ${inst} | cut -d '-' -f2' = H1 ]; then
      ssh  -t  username@hostname1 "sudo ls"
    fi
  done

Eu não sou capaz de executar a parte ssh -t, ele diz que o terminal psuedo não será alocado porque stdin não é um terminal sudo: no tty present e nenhum programa askpass especificado Eu tentei com -t -t e -n, sem sorte. Eu não posso editar o arquivo visudo do host que eu estou executando este comando de.

Editar

$ cat all_data
ABC-DIF2    DELL-800    60999
ABC-DIF3    HP-DL340    J0777
ABC-DIF4    DELL-800    P0087
.
.
.

O all_data contém milhares de entradas semelhantes. O que eu estou tentando fazer da seguinte maneira. 60999, J0777 ... são as entidades nas quais preciso executar comandos.

Então, estou tentando ler cada linha, dividir e verificar qual é o número DIF correspondente à entidade.

por exemplo, se eu ler DIF2, isso significa que preciso ssh em hostname2 e execute o comando para obter dados no 60999

Se, se eu ler DIF3, isso significa que para a entidade J0777 só pode ser executado a partir do hostname3.

    
por coolguy6764 22.07.2017 / 23:40

1 resposta

1

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
    
por 23.07.2017 / 06:47

Tags