"Wi-Fi 또는 이더넷을 통한" 스크립트 [닫기]

"Wi-Fi 또는 이더넷을 통한" 스크립트 [닫기]

Wi-Fi 또는 이더넷으로 연결할 수 있는 호스트가 있습니다. 링크에 따라 조치를 취하고 싶습니다.

스크립트로 이를 어떻게 감지하나요?

답변1

각 링크 유형에 사용되는 인터페이스는 다릅니다. 이더넷 인터페이스는 다를 수 있습니다.eth0WLAN 인터페이스는무선랜0. 활동 중인 이름을 알고 그에 따라 행동합니다.

모든 인터페이스를 나열하고 해당 상태를 표시하려면 명령을 사용하십시오 ip link show. 이 명령은 Linux의 최신 버전에서 작동하므로 나머지 유틸리티 및 Bash 쉘도 모든 OS에 적용할 수 있다고 가정합니다(Windows에서는 cygwin을 사용하는 것이 좋습니다. 그리고또는 Python으로 구문 분석하기IP구성또는넷쉬출력 또는PowerShell Get-NetAdapter 모듈).

예제 출력:

user@host$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group     default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:50:56:9b:90:7d brd ff:ff:ff:ff:ff:ff

grep그런 다음 숫자로 시작하는 줄을 찾아 인터페이스 이름/상태를 필터링할 수 있습니다 .

user@host$ ip link show | grep "^[0-9]"
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group     default qlen 1
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

활성 인터페이스에는 UP이라는 단어가 있으므로 활성 인터페이스를 얻으려면 로컬 인터페이스 localhost(봐라:):

user@host$ ip link show | grep "^[0-9]" | grep -v "lo: " | grep "UP"
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

인터페이스 이름, 즉 두 번째 단어만 필요합니다.

user@host$ ip link show | grep "^[0-9]" | grep -v "lo: " | grep "UP" | cut -d ':' -f 2
 ens32

이 결과를 일부 변수(Bash)에 저장할 수 있습니다.

ACTIVEIF=$(ip link show | grep "^[0-9]" | grep -v "lo: " | grep "UP" | cut -d ':' -f 2)

물론, 활성 인터페이스가 두 개 이상인 경우 결과 주위에 괄호와 공백을 추가하여 이름 배열에 목록을 저장합니다.이제부터는 물리적 인터페이스가 하나뿐이므로 lo:를 필터링하지 않겠습니다.):

ACTIVEIFACES=( $(ip link show | grep "^[0-9]" | grep "UP" | cut -d ':' -f 2) )

배열 변수의 내용을 확인하려면 다음을 수행하십시오.

user@host$ set | grep ^ACTIVEIFACES
ACTIVEIFACES=([0]="lo" [1]="ens32")

스크립트에 나열합니다.

ACTIVEIFACES=( $(ip link show | grep "^[0-9]" | grep "UP" | cut -d ':' -f 2) )
NIFACES=${#ACTIVEIFACES[@]}
if [ $NIFACES -ne 0 ] ; then
   echo "There exist $NIFACES active interfaces:"
   for ((i=0; i<NIFACES; i++)) ; do
       echo "${ACTIVEIFACES[$i]}"
   done
else
   echo "There is no active interfaces detected"
fi

(이 for명령은 숫자 표현식을 사용하므로 이중 괄호 사이의 $i와 $NIFACES의 $를 생략할 수 있습니다.)

내 경우에는 스크립트 출력은 다음과 같습니다.

There exist 2 active interfaces:
lo
ens32

이 방법이 당신에게 효과가 있기를 바랍니다. 행운을 빌어요!

답변2

순진한 대답은 인터페이스를 모니터링하는 것이지만 연결(이더넷)되거나 연결(WiFi)되면 레이어 2 인터페이스는 "위"로 등록되지만 그 자체로는 트래픽을 전달하는 데 사용될지 여부를 알 수 없습니다. .

대신 기본 경로에 대한 변경 사항을 모니터링하는 것이 더 효과적일 수 있습니다.

ip mon명령을 사용하여 변경 사항을 추적할 수 있지만 변경된 사항이 없는 것처럼 보이더라도 정기적인 상태 업데이트를 제공하므로 이러한 변경 사항을 무시할 준비가 되어 있어야 합니다.

-o( 각 보고서가 자체 라인에 있도록 이 옵션을 사용하는 것이 좋습니다 . 이렇게 하면 구문 분석이 더 간단해집니다.)

#!/bin/bash
ip -o mon |
sed -e 's/\\/ /g
        s/  */ /g
        s/^\(Deleted \|\)\([0-9]*\): \([^ :]*\) /\1addr \2 \3 / 
        s/^\(Deleted \|\)\([0-9]*\): \([^ :]*\): /\1link \2 \3 / ' |
while
    IFS=' ' read -ra line
do
    if [[ ${line[0]} = Deleted ]]
    then
        mode=delete
        line=( "${line[@]:1}" )  # shift(line)
    else
        mode=update
    fi
    case "${line[*]}" in
        addr)  # added by 'sed' above
            device_num=${line[1]}
            device_name=${line[2]}
            family=${line[3]}  # 'inet' or 'inet6'
            ip_address=${line[4]}
            # ... handle address changes  ...
            ;;
        link)  # added by 'sed' above
            device_num=${line[1]}
            device_name=${line[2]%:}
            state=${line[3]}   # eg '<BROADCAST,MULTICAST,UP,LOWER_UP>'
            # ... handle link UP/DOWN ...
            ;;
        default)
            # ... handle default route changes ...
            ;;
        prefix | local | broadcast | multicast | throw | unreachable | prohibit | blackhole )
            # ... handle other route changes ...
            ;;
    esac
done

관련 정보