배쉬 | Txt 파일 > tmp> 프로세스 tmp> 출력

배쉬 | Txt 파일 > tmp> 프로세스 tmp> 출력

최근에 우리는 모든 장치와 상호 작용할 수 있는 Jump Host를 얻었습니다. 빨간색은 6.x이고 루트 액세스 권한이 없습니다. Autoexpect 및 bash에서만 스크립트를 작성할 수 있으며 모듈은 사용할 수 없습니다.

출처: 5000개의 장치가 있습니다(한 줄에 1개, 각각 3개의 인수 - 위치 HostName IP - 탭으로 구분됨).

작업: 위치(ARGV1)당 모든 장치를 검색하고(예: 5000, 40은 한 위치에 해당함) 출력을 임시 파일로 리디렉션하고(출력 없음, 에코 꺼짐) 임시 디렉터리의 각 장치에 대해 명령을 실행합니다. 출력은 IP가 아닌 HostName ARGV2에 대한 것이어야 합니다.

tmp에서 각 장치를 ping하고 각 호스트에 대해 성공을 반환하거나 각 장치에 로그인하고 명령을 실행하고 호스트에 대한 결과를 출력하고 tmp 파일의 다음으로 이동한다고 말합니다.

입력 파일 구조 예:

AA Torp1 1.1.1.1 
AA Torp2 2.2.2.2
BB Torp97 9.9.9.9

AA 위치에서 각 장치에 ping을 보내고 싶다고 가정해 보겠습니다. tmp로 스크립트를 작성한 cat hosts.txt | grep AA다음 각 IP를 핑하는 방법은 무엇입니까? 예를 들어 1.1.1.1출력 2.2.2.2은 다음과 같습니다.

Torp1 핑이 성공하면 OK Torp2 핑이 좋지 않으면 NOK

이것은 기본 예입니다. 또는 위치를 기반으로 각 IP를 파악한 ssh에 대해 명령 인쇄 출력을 실행한 다음 tmp 파일을 제거합니다.

답변1

이를 수행하는 간단한 방법은 while read루프를 사용하는 것입니다. 일반적인 형식은 다음과 같습니다.

while read var1 var2 ... varN; do something; done < inputFile

기본적으로 각 입력 줄은 공백으로 분할되므로 이것이 이미 기본적으로 필요한 것입니다.

while read location hostname ip; do
    printf "Ping of $hostname ($ip): "
    ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done < ips.txt

또는 특정 위치로 제한하려면 다음을 수행하세요.

grep location ips.txt | while read location hostname ip; do
    printf "Ping of $hostname ($ip): "
    ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done

이 파일로 이것을 테스트하면:

location1 example.com 93.184.216.34
location2 google.com 8.8.8.8
location1 bad.com 123.456.7.8

우리는 다음을 얻습니다:

$ grep -w "^$location" ips.txt | 
    while read location hostname ip; do     
        printf "Ping of $hostname ($ip): ";     
        ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"; 
    done 
Ping of example.com (93.184.216.34): OK
Ping of bad.com (123.456.7.8): FAILED

관련 정보