분명히 MacOs 에는 "첫 번째 성공적인 응답을 받은 후 반환" 또는 이와 유사한 옵션이 ping
있습니다 . -o
바라보다:https://stackoverflow.com/a/6119327/4561887.
Linux Ubuntu에도 이에 상응하는 것이 있습니까? 어떻게 하면 동일한 결과를 가장 잘 얻을 수 있습니까?
내 버전은 입니다 . ping utility, iputils-s20161105
에서 반환했습니다 ping -V
.
업데이트: 여기에서 MacOs 문서를 찾았습니다.https://ss64.com/osx/ping.html
-o Exit successfully after receiving one reply packet.
답변1
핑 사용:
ping -c 1 ping_address
ping -c 1 192.168.1.68 #example
c
매개변수는 패킷 수를 계산하는 데 사용되므로1
이것이 필요한 이유는 -->-c 1
명령을 실행한 후 해당 내용을 볼 수 있습니다.종료 상태
$?
명령을 사용하여 . ping을 사용한 후에는 다음과 같이 표시됩니다.0(성공, 알았어). 그렇지 않으면 or 를 입력한 후에1
or 를 얻습니다 . 이는 다음을 의미합니다.2
$?
실수.
PING 출력은 다음을 반환합니다 echo
.
1 received, 0% packet loss -> (Success echo $? #returns 0
0 received, 100% packet loss -> (Failure)echo $? #returns 1
서비스를 사용할 수 있게 되면 중지하고 이를 while 루프로 전달하는 무한 루프입니다.
while ! ping -c1 -W1 192.168.1.68; :;done
- 하지만아니요
!
살아있고 계속 반복하며 항상 종료 상태로 종료합니다.성공:
-W1
1초만 기다리세요
이름이 지정된 파일에 복사하세요.pingo
#!/usr/bin/bash
while ! ping -c1 -W1 "$1"; do
: && echo "NOT ALIVE"
done
:
Null 명령이거나 효과가 없습니다. 명령이 아무 작업도 수행하지 않거나 종료 상태가 항상 성공합니다. 이 경우 true를 입력하는 것과 유사합니다. 는 Bourne Shell 내장- 이 변수
$1
는첫 번째 명령줄 매개변수, 이 경우에는 숫자IP 주소. 예를 들어,pingo 192.168.1.68
교체1지정된 IP 주소로. "
사용자의 bin 디렉토리
라는 이름의 폴더를 만듭니다.쓰레기통. 해당 폴더에 다음과 같은 파일을 만듭니다.핑고파일을 프로그램으로 실행할 수 있습니다.
mkdir ~/bin # make directory at /home/user/bin
cd ~/bin # change to /home/user/bin directory
touch pingo # create file pingo copy the above command and save it
chmod +x pingo # give permission to execute
- 이
/home/user/bin
폴더는 "ping" 명령처럼 터미널에서 어디서나 실행할 수 있는 프로그램의 기본 위치입니다.
이제 처럼 pingo
어떤 주소로도 실행할 수 있습니다 ping -o
.
PING 매뉴얼에서:
- ping이 성공하면아니요 받다 어느회신하다데이터 팩어쨌든 종료됩니다코드 1.
- 패킷인 경우계산그리고마감 시간지정되며, 최종 기한에 도달할 때까지 수신된 패킷 수보다 적은 경우에도 종료됩니다.코드 1. 존재하다기타 오류, 종료될 때코드 2.예:
- 1을 세고 2초를 기다립니다하지만두번째 2개는 아직 안왔네요그 다음에오류가 발생하여 종료
- 그렇지 않으면 종료됩니다.코드 0. [ 좋아요 ]
이렇게 하면 다음을 사용할 수 있습니다.종료 코드확인해 보세요주인예살다또는아니요.
답변2
ping
Mac처럼 작동 하도록 시도하는 해결 방법은 여러 가지가 있지만 ping -o
다음 명령이 있습니다.fping
바로 그 일을 하며 스크립트와 여러 대상에 동시에 사용되도록 설계되었습니다. ~에서수동:
[...]
기본 모드에서는 대상이 응답하면 기록되어 대상 목록에서 제거되어 확인됩니다. 대상이 특정 시간 제한 및/또는 재시도 제한 내에 응답하지 않으면 도달할 수 없는 것으로 지정됩니다.
[...]
예:
$ time fping example.com
example.com is alive
real 0m0.074s
user 0m0.000s
sys 0m0.004s
$ echo $?
0
$ fping 192.0.2.3 127.0.0.1
ICMP Host Unreachable from 203.0.113.1 for ICMP Echo sent to 192.0.2.3
127.0.0.1 is alive
ICMP Host Unreachable from 203.0.113.1 for ICMP Echo sent to 192.0.2.3
ICMP Host Unreachable from 203.0.113.1 for ICMP Echo sent to 192.0.2.3
192.0.2.3 is unreachable
$ echo $?
1
$ fping -q 192.0.2.3
$ echo $?
1
답변3
내 자신의 연구를 수행하고 여기에 있는 다른 두 가지 답변을 검토한 후 다음과 같은 결론에 도달했습니다.Linux에는 MacOS에 존재하는 명령과 ping -o
동일한 명령이 없습니다.어느 것도 아니다ping -c 1
...도 아니다 fping
같은 행동을 합니다.할 수 있는 최선의 방법은 이러한 함수의 반환 코드가 ping이 성공했음을 나타내는 반환 fping
하는 루프에서 또는 를 사용하여 해당 동작을 시뮬레이션하는 것입니다.ping
0
테스트 후
fping
다음과 같이 말할 수 있습니다.fping 192.168.0.1
동작은ping -c 4 -W 1 192.168.0.1
네트워크가 꺼져 있을 때와 같고ping -c 1 192.168.0.1
네트워크가 켜져 있을 때와 같습니다.fping
네트워크가 작동 중이면 즉시 반환되고, 네트워크가 중단되면 4번 시도하고(초기 시도 1회 + 재시도 3회, 각 시도 후 시간 초과 1초) 4번의 시간 초과 = 총 4초 후에 반환됩니다.ping -o
네트워크가 작동 중이면 즉시 반환되지만 영원히 반복됩니다.인터넷이 등장하기 전까지, 네트워크에 장애가 발생하면 반환됩니다.
그래서, 사용수고하셨습니다 @AlexPixel, 이것이 내 대답입니다. 이 양식은 Ctrl+ CKill 신호를 캡처하여 무한 루프를 강제로 종료할 수 있도록 하고 while
런타임에 IP 주소에 대한 매개변수를 입력하도록 하며 IP 주소가 활성화될 때 시도 횟수와 메시지를 인쇄합니다.
ping_loop.sh:
#!/bin/bash
IP_ADDR="$1"
if [ -z $IP_ADDR ]; then
echo "You must enter the IP Address as the first parameter!"
exit 1
fi
# to enable Ctrl + C inside the infinite while loop
trap 'printf "%s\n" "Ctr + C"; exit 2' SIGINT
count=0
while true; do
echo "Attempt: $count"
((count++))
ping -c 1 -W 5 "$IP_ADDR"
return_code=$?
if [ $return_code -eq 0 ]; then
echo "== DEVICE AT IP '$IP_ADDR' IS ALIVE! =="
break;
fi
done
다음과 같이 실행 파일을 만들고 chmod +x ping_loop.sh
"설치"합니다.
~/bin
어디에서나 실행할 수 있도록 이 스크립트에 심볼릭 링크를 만듭니다 .cd /path/to/here mkdir -p ~/bin ln -si "${PWD}/ping_loop.sh" ~/bin/gs_ping_loop ln -si "${PWD}/ping_loop.sh" ~/bin/ping_loop
- 이제 어디서나 직접 또는 명령을 사용할 수 있습니다
ping_loop
. Ubuntu를 사용하고 처음 생성하는 경우 파일이 경로에 자동으로 추가되므로 로그아웃gs_ping_loop
했다~/bin
가 다시 로그인해야 할 수도 있습니다 .PATH
~/bin
~/.profile
테스트해보세요:
ping_loop 10.0.0.1
이제 테스트를 위해 해당 IP 주소를 강제로 변경하는 방법에 대한 다른 답변을 여기에서 읽을 수 있습니다 ping
.특정 IP 주소에서 이더넷 인터페이스를 생성하여 핑을 보내고 때로는 응답하고 때로는 응답하지 않도록 하려면 어떻게 해야 합니까?.
한 가지 방법은 다음과 같습니다.
# block traffic to 10.0.0.1
sudo iptables -I OUTPUT 1 -p icmp --icmp-type echo-request -d 10.0.0.1 -j DROP
# allow traffic to 10.0.0.1
# NB: you must run this as many times as you ran the cmd above in order to
# allow traffic. So, if you ran the cmd above an unknown number of times,
# run this command as many times as it takes until you see:
#
# iptables: Bad rule (does a matching rule exist in that chain?).
#
sudo iptables -D OUTPUT -p icmp --icmp-type echo-request -d 10.0.0.1 -j DROP
샘플 출력. 먼저 위 명령을 사용하여 트래픽을 차단한 다음 위의 다른 명령을 사용하여 트래픽 차단을 해제하여 트래픽이 통과 ping
하고 스크립트가 종료되도록 했습니다. == DEVICE AT IP '10.0.0.1' IS ALIVE! ==
마지막에 인쇄된 내용을 볼 수 있습니다 .
$ gs_ping_loop 10.0.0.1 Attempt: 0 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. ping: sendmsg: Operation not permitted --- 10.0.0.1 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms Attempt: 1 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. ping: sendmsg: Operation not permitted --- 10.0.0.1 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms Attempt: 2 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. ping: sendmsg: Operation not permitted --- 10.0.0.1 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms Attempt: 3 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. ping: sendmsg: Operation not permitted --- 10.0.0.1 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms Attempt: 4 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=4.20 ms --- 10.0.0.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 4.204/4.204/4.204/0.000 ms == DEVICE AT IP '10.0.0.1' IS ALIVE! ==
이게 내 최종 형태야ping_loop.sh내eRCAGuy_dot파일환매 계약:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/ping_loop.sh<-- 이 코드의 최신 버전을 보관하는 곳입니다!
또한보십시오:
- 다음은 IP 주소의 "ping 가능성"을 켜고 끄는 방법에 대한 내 답변을 포함하여 3가지 답변입니다. 이를 통해
ping_loop
위의 스크립트를 테스트할 수 있습니다 .특정 IP 주소에서 이더넷 인터페이스를 생성하여 핑을 보내고 때로는 응답하고 때로는 응답하지 않도록 하려면 어떻게 해야 합니까?