![라우팅 테이블과 비교하여 IP 목록을 확인하고 각각 어떤 gw/dev에 액세스되는지 표시합니다.](https://linux55.com/image/94778/%EB%9D%BC%EC%9A%B0%ED%8C%85%20%ED%85%8C%EC%9D%B4%EB%B8%94%EA%B3%BC%20%EB%B9%84%EA%B5%90%ED%95%98%EC%97%AC%20IP%20%EB%AA%A9%EB%A1%9D%EC%9D%84%20%ED%99%95%EC%9D%B8%ED%95%98%EA%B3%A0%20%EA%B0%81%EA%B0%81%20%EC%96%B4%EB%96%A4%20gw%2Fdev%EC%97%90%20%EC%95%A1%EC%84%B8%EC%8A%A4%EB%90%98%EB%8A%94%EC%A7%80%20%ED%91%9C%EC%8B%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
내 라우팅 테이블에는 IP 주소 목록과 함께 긴 규칙 세트가 있습니다. CSV 데이터와 유사한 출력을 얻고 싶습니다. 여기서 첫 번째 열은 원래 목록의 IP 주소이고, 두 번째 열은 라우팅 테이블의 현재 규칙을 기반으로 해당 IP에 연결하는 데 사용되는 게이트웨이입니다. 세 번째 열은 연결에 사용될 장치입니다.
경로 데이터를 가져오고 그렇게 하기 위한 스크립트 작성을 잠시 고려했지만 route -n
서브넷 계산을 수행하는 함수를 생각하는 과정에서 이 특정 바퀴가 발명되었을 수도 있고 이미 어딘가에 존재한다는 생각을 지울 수 없었습니다. 에.
내가 원하는 것을 어떤 명령으로 달성할 수 있는지 아는 사람이 있나요?
답변1
이를 사용하여 ip route get
컴퓨터가 IP로 라우팅하는 방법을 결정할 수 있습니다. 따라서 파일에 IP 목록이 한 줄에 하나씩 있으면 다음을 수행할 수 있습니다.
while read -r addr; do
gw="$(ip route get "$addr" | awk '/via/ {print $3}')"
if [[ -z $gw ]]; then
printf 'No route for %s\n' "$addr" >&2
else
printf '%s,%s\n' "$addr" "$gw"
fi
done < ip_list
이런, 개발자를 제공하는 것을 잊어버렸습니다. 해결 방법은 다음과 같습니다.
while read -r addr; do
ip route get "$addr" | awk -va="$addr" '/via/ {print a "," $3 "," $5} $2 == "dev" {print a ",," $3}'
done < ip_list