Para que o loop não seja executado corretamente sobre o ssh

1

Eu tenho um script no qual estou lendo de um arquivo csv no qual ele contém SourceIp, DestinationIP,Source Ports, Destination Ports .

Primeiro eu estou lendo o sourceIp e tentando fazer o ssh sobre ele (eu consigo fazer isso com sucesso), aqui estou tentando obter um pseudo-terminal e quero executar um loop for que itera sobre o sourcePorts (hífen separados) e destinationPorts.

Conteúdo do arquivo de entrada:

10.X.X.9,10.X.X.23,8140-61613,1521-1524-1525-1526-1530-1531-8140-61613

Script:

export lastSourceIP=""
export lastDestinationIP=""
export fqdn=""
export sourceFqdn=""
x=0
export username="sjain";
export location="/home/sjain/poc";
export baseLocation="10.X.X.9"
while IFS="," read f1 f2 f3 f4
do
        x=$(($x+1))
        TMP=$(mktemp)
        TMP2=$(mktemp)
        echo "Source IP        : $f1"       
        echo "Destination IP   : $f2"
        echo "Source Ports             : $f3"
        echo "Destination Ports             : $f4"
export sourceIP=$f1
export destIP=$(echo "$f2" | tr -d '\n')
export port=$(echo "$f3" | tr -d '\n')
export destinationPorts=$(echo "$f4" | tr -d '\n')
ssh -t -t $username@$sourceIP 'bash -s' <<ENDSSH
(IFS='-'; for sourceP in $port; do 
 (for destinationP in $destinationPorts; do
    echo "$sourceP" - "$destinationP"
 done;) 
done;)
exit 
ENDSSH

done < ipaddress.csv

Mas quando estou executando este script, ele não está imprimindo valores de sourceIP - DestinationIp. Aqui está a saída que estou recebendo no console.

Saída:

    Source IP        : 10.X.X.9
    Destination IP   : 10.X.X.23
    Source Ports             : 8140-61613
    Destination Ports             : 1521-1524-1525-1526-1530-1531-8140-61613
    tcgetattr: Inappropriate ioctl for device
    (IFS='-'; for sourceP in 8140-61613; do
     (for destinationP in 1521-1524-1525-1526-1530-1531-8140-61613; do
        echo "" - ""
     done;)
    done;)
    exit
    [[email protected] ~]$ (IFS='-'; for sourceP in 8140-61613; do
    >  (for destinationP in 1521-1524-1525-1526-1530-1531-8140-61613; do
    >     echo "" - ""
    >  done;)
    > done;)
     -
    [[email protected] ~]$ exit
    exit
    Connection to 10.X.X.9 closed

.

Resultado esperado:

8140-1521
8140-1524
.... and so on

Por favor, ajude onde estou fazendo errado.

    
por saurav 24.03.2014 / 17:15

1 resposta

5

Você precisa garantir que os loop vars não foram detectados no host remoto:

ssh -t -t $username@$sourceIP 'bash -s' <<ENDSSH
 IFS='-'
 for sourceP in $port; do 
  for destinationP in $destinationPorts; do
    echo "\$sourceP" - "\$destinationP"
  done 
 done
ENDSSH

Usar todos os parênteses lança um subshell para cada iteração de loop, que é um monte de trabalho extra que você não precisa.

Você não precisa exportar todas as suas variáveis, apenas aquelas que precisam estar no ambiente para processos filhos.

Este destIP=$(echo "$f2" | tr -d '\n') não é diferente de destIP=$f2 - assumindo que não há novas linhas "internas". $(command substitution) remove as novas linhas finais.

    
por 24.03.2014 / 17:41