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