실행 시 "개인 IP: XXXX"를 표시하는 bash 스크립트를 작성해야 합니다. 이런 스크립트를 어떻게 작성할까요?
저도 같은 작업을 수행해야 하지만 개인 IP 대신 공용 IP를 사용해야 합니다.
어떤 팁이라도 도움이 될 것입니다. 감사합니다!
답변1
ipv4에만 관심이 있다고 가정합니다.
#!/bin/bash
lanIp="$(ip -4 -o -br addr|awk '$0 ~ /^[we]\w+\s+UP\s+/ {str = gsub("/[1-9][0-9]*", "", $0); print $3}')";
wanIp="$(curl https://ipinfo.io/ip 2>/dev/null)";
echo "Your private ip is: ${lanIp}";
echo "Your public ip is: ${wanIp}";
설명하다:
첫 번째 명령은 이 ip
명령을 사용하여 로컬 네트워크 ipv4 주소를 가져온 다음 awk
출력에서 ipv4 주소만 추출되도록 출력을 파이프합니다.
그러나 ip
존재하는 각 네트워크 인터페이스에 대해 행이 표시되며 각 행의 정보는 단순한 IP 주소 이상의 것입니다. 따라서 비활성 인터페이스를 필터링하고 IP 주소만 유지해야 합니다. 원하는 경우 및 를 사용하여 이러한 단계를 수행할 수 있지만 grep
여기서는 이를 사용했습니다.sed
perl
awk
awk
$0
첫 번째 명령의 전체 출력 줄을 정규식과 일치시키는 데 사용되며 , ^[we]\w+
줄에 "e" 또는 "w"로 시작하는 이름이 포함되어 있는지 확인합니다(Linux의 Wi-Fi 및 이더넷 네트워크 인터페이스는 종종 이런 식으로 시작됩니다). 이 부분은 완전히 이식 가능하지는 않지만 Termux뿐만 아니라 여러 Linux 배포판에서 작동합니다. 아직 Mac이나 BSD에서는 테스트하지 않았습니다. 또한 활성 네트워크 인터페이스만 일치하도록 인터페이스 이름 뒤에 "UP" 텍스트가 오는지 확인합니다. 그런 다음 awk
함수를 사용하여 gsub
결과에서 IP 주소만 추출하고 이를 변수에 설정된 표준 출력으로 다시 인쇄합니다 lanIp
.
eth0
정적으로 명명된 네트워크 인터페이스가 있거나 스크립트에 인터페이스 이름을 하드코딩할 수 있는 경우 이는 단순화될 수 있습니다. 대부분의 최신 Linux 배포판은 반 무작위로 생성된 인터페이스 이름을 사용하고 이는 Wi-Fi 또는 이더넷 인터페이스에서 작동하기 때문에 위의 방법을 사용하고 있습니다.
두 번째 명령은 컬을 사용하여 웹 사이트에서 WAN 주소를 가져옵니다. 이는 WAN IP를 반환하고 다른 출력을 컬에서 /dev/null
.