bash + ssh 테스트를 프로세스로 실행하는 방법

bash + ssh 테스트를 프로세스로 실행하는 방법

내 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 ) &

관련 정보