내 Bash 스크립트에서는 다음 구문을 사용하여 SSH 연결 테스트를 테스트합니다.
IP=12.3.4.55
sshpass -p secret123 /usr/bin/ssh -n -o ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q root@$IP exit
[[ $? -eq 0 ]] && echo ssh test is ok || echo ssh test is fail
하지만 나는 &를 사용하고 싶습니다(그래서 모든 ssh 라인은 ss 프로세스를 실행합니다)
그래서 내가 이걸 했어
IP=12.3.4.55
sshpass -p secret123 /usr/bin/ssh -n -o ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q root@$IP exit &
[[ $? -eq 0 ]] && echo ssh test is ok || echo ssh test is fail
그러나 위 마지막 예의 ssh 테스트는 잘못된 IP 주소에서도 작동하므로 ssh 테스트가 실패하더라도 $?
그렇다면 &를 사용하여 모든 ssh 구문을 어떻게 설정합니까?
참고 - 온라인에 추가하고 싶은 이유는 1000개가 넘는 Linux 시스템을 스캔해야 하고 &를 사용하는 것이 더 빠르기 때문입니다.
답변1
스크립트가 백그라운드에서 실행되고 여러 연결을 병렬로 테스트할 수 있도록 테스트를 함수로 이동하기만 하면 됩니다.
#!/bin/bash
testConnection(){
user=$1
ip=$2
sshpass -p secret123 /usr/bin/ssh -n -o ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q "$user"@"$ip" exit
[[ $? = 0 ]] && echo "$user@$ip OK" || echo "$user@$ip FAILED"
}
users=( terdon terdon )
ips=( 123.4.5.6 127.1.0.0 )
for ((i=0;i<${#users[@]};i++)); do
testConnection "${users[i]}" "${ips[i]}" &
done
## The script should wait and not exit until
## all background processes finish.
wait
그런 다음 다음과 같이 실행할 수 있습니다.
$ foo.sh
[email protected] FAILED
[email protected] OK
답변2
결과에 관심이 있다면 어느 시점에서는 wait
명령이 백그라운드/하위 셸에서 실행될 때 결과에 관심을 가져야 합니다(TLDP에 대해 자세히 알아보세요).https://tldp.org/LDP/abs/html/subshells.html).
이 예에서는 "서브쉘에서 실행되는 내용"이 아닌 "서브쉘 생성" 부분이 성공 여부를 확인합니다.
비슷한 작업을 수행할 수도 있습니다. 즉, 서브셸에서 실행되는 함수가 있습니다.
#!/bin/bash
testIp() {
ip=$1
user=$2
sshpass ... ssh -n -o ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q $USER@$IP exit
[[ $? = 0 ]] && echo ssh test is ok || echo ssh test is fail
}
( testIp YOURIP root ) &
( testIp YOUROTHERIP root2 ) &