.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)