나는 한 서버에서 다른 서버 세트로 ssh를 실행하고 IP 세트에 대해 netcat 명령을 실행하는 Gnu/Linux의 Bash 쉘 스크립트를 만들었습니다.
다음은 SSH를 통해 다른 서버에 연결하는 스크립트입니다.
*read -p "Enter the instant stack host[s]: " hosts
read -p "Enter the list of destinations [IP]: " dest_list
read -p "Enter the port # associated with the destination: " port
for h in $hosts
do
scp ./connectivityTest.sh @$h:/var/tmp/
ssh user@$h . /var/tmp/connectivityTest.sh "$dest_list" "$port"
done*
netcat 명령을 실행하는 스크립트는 다음과 같습니다.
*echo "Working on `hostname` to check connectivity for following end points"
echo $1
echo $2
dest_list=`echo "$1"`
port=`echo "$2"`
echo $dest_list
for d in $dest_list
do
echo "Endpoint checked: $d"
nc -v -i 1 -w 5 $d $port
done
exit*
실행할 단일 IP [엔드포인트]만 제공하면 스크립트가 제대로 실행됩니다.
*Enter the instant stack host[s]: host1.com
Enter the list of destinations [IP]: **test.ip1.com**
Enter the port # associated with the destination: 443
connectivityTest.sh 100% 520 1.8MB/s 00:00
##############################################################
Working on host1 to check connectivity for following end points
##############################################################
test.ip1.com
443
test.ip1.com
Endpoint checked: test.ip1.com
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to ip1:443.
Ncat: Idle timeout expired (1000 ms).*
그러나 여러 엔드포인트를 제공하면 스크립트는 두 번째 IP/엔드포인트를 포트 번호로 사용합니다.
*Enter the instant stack host[s]: host1.com
Enter the list of destinations [IP]: **test.ip1.com test.ip2.com**
Enter the port # associated with the destination: 443
connectivityTest.sh 100% 520 1.8MB/s 00:00
##############################################################
Working on host1 to check connectivity for following end points
##############################################################
test.ip1.com
**test.ip2.com**
test.ip1.com
Endpoint checked: test.ip1.com
Ncat: Version 7.50 ( https://nmap.org/ncat )
**Ncat: Invalid port number "test.ip2.com". QUITTING.***
또한 이는 스크립트가 SSH를 통해 실행될 때만 발생합니다. 서버에서 직접 스크립트를 실행하면 여러 IP에서 제대로 작동합니다. 이 수준에서는 뭔가 잘못된 것이 분명합니다.
*ssh user@$h . /var/tmp/connectivityTest.sh "$dest_list" "$port"*
그러다가 이 해결책을 찾았습니다. 작은따옴표 아래에 입력 변수를 추가했습니다.
*ssh user@$h . /var/tmp/ "'$dest_list'" "'$port'"*
이제 여러 IP에서 작동합니다.
*Enter the instant stack host[s]: host1.com
Enter the list of destinations [IP]: **test.ip1.com test.ip2.com test.ip3.com test.ip4.com**
Enter the port # associated with the destination: 443
connectivityTest.sh 100% 525 1.5MB/s 00:00
##############################################################
Working on host1 to check connectivity for following end points
##############################################################
test.ip1.com test.ip2.com
443
test.ip1.com test.ip2.com
Endpoint checked: test.ip1.com
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to ip1:443.
Ncat: Idle timeout expired (1000 ms).
Endpoint checked: test.ip2.com
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to ip2:443.
Ncat: Idle timeout expired (1000 ms).*
해결했는데 어떻게 해결해야할지 모르겠어요아포스트로피달리는 것의 차이로컬 스크립트와 SSH를 통한 스크립트 실행. 그리고 어떻게아포스트로피달리는 것의 차이다중 입력 스크립트와 단일 입력 스크립트 비교.
어떤 통찰력이라도 도움이 될 것입니다. 미리 감사드립니다! ! !
답변1
당신이라면 어떻게 될까요?
ssh user@$h . /var/tmp/connectivityTest.sh '$dest_list' '$port'
?
해결 방법과 동일하게 작동하는 경우 문제는 변수가 확장되는 시스템(로컬 또는 원격)에 있는 것입니다.