For 루프가 SSH를 통해 올바르게 실행되지 않습니다.

For 루프가 SSH를 통해 올바르게 실행되지 않습니다.

.csv 파일이 포함된 csv 파일을 읽는 스크립트가 있습니다 SourceIp, DestinationIP,Source Ports, Destination Ports.

먼저, sourceIp를 읽고 여기에 ssh를 시도하고 있습니다(성공적으로 수행할 수 있습니다). 여기서는 의사 터미널을 얻고 sourcePort(하이픈)를 반복하는 for 루프를 실행하려고 합니다. 별도) 및 대상 포트.

입력 파일 내용:

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

스크립트:

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

하지만 이 스크립트를 실행하면 sourceIP - DestinationIp 값이 인쇄되지 않습니다. 이것이 콘솔에서 얻는 출력입니다.

산출:

    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

.

예상 출력:

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

내가 뭘 잘못하고 있는지 도와주세요.

답변1

원격 호스트에서 루프 변수가 역참조되는지 확인해야 합니다.

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

모든 괄호를 사용하면 각 루프 반복에 대해 하위 쉘이 시작되며 이는 필요하지 않은 추가 작업이 많이 발생합니다.

모든 변수를 내보낼 필요는 없으며 하위 프로세스 환경에 필요한 변수만 내보낼 수 있습니다.

이는 "내부" 개행 문자가 없다고 가정하는 것과 destIP=$(echo "$f2" | tr -d '\n')다르지 않습니다. 후행 줄 바꿈을 제거하십시오.destIP=$f2$(command substitution)

관련 정보