![Bash를 사용하여 특정 범위에서 사용 가능한 첫 번째 포트를 선택하는 가장 짧은 방법은 무엇입니까?](https://linux55.com/image/68548/Bash%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8A%B9%EC%A0%95%20%EB%B2%94%EC%9C%84%EC%97%90%EC%84%9C%20%EC%82%AC%EC%9A%A9%20%EA%B0%80%EB%8A%A5%ED%95%9C%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%ED%8F%AC%ED%8A%B8%EB%A5%BC%20%EC%84%A0%ED%83%9D%ED%95%98%EB%8A%94%20%EA%B0%80%EC%9E%A5%20%EC%A7%A7%EC%9D%80%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
목적:범위에서 사용 가능한 첫 번째 포트를 선택합니다. 예를 들어 포트 600을 사용할 수 없으면 포트 601을 사용 가능한지 확인합니다.
시도:다음 스크립트는 예상대로 작동하지만 제 생각에는 너무 포괄적입니다.
PORT=601; until [ $PORT -gt 610 ]; do
if ! [[ `ss -nat | grep "*:$PORT\s"` ]]; then
echo $PORT;
exit 0;
elif [ $PORT -eq 610 ]; then
echo "no ports available";
exit 1;
fi;
let PORT+=1;
done
예상 답변:가장 간결한 스크립트를 제공하는 답변이 투표되어 승인됩니다. 스크립트는 여전히 목표를 충족할 수 있어야 합니다.
답변1
이건 어때. 한 번만 전화해 ss
혜택을 받으세요.
USED=$(ss -nat '( sport >= :601 and sport <= :610 )'|awk 'NR>1{print substr($4,3)}')
for PORT in {601..610}; do
echo $USED | grep $PORT >/dev/null
if [ $? != 0 ];then
echo $PORT
exit 0
fi
done
echo no ports available
exit 1
약간 더 짧은 시도:
USED=$(ss -nat '( sport >= :601 and sport <= :610 )'|awk 'NR>1{print substr($4,3)}')
for PORT in {601..610}; do
[[ ! "$USED" =~ "$PORT" ]] && echo $PORT && exit 0
done
echo no ports available
exit 1
답변2
PORT=$(ss -nat | cut -b47- | sort -n |
awk 'BEGIN{p=601} $1+0>610{exit(1)} $1+0==p{p++} $1+0>p{print p;exit}') ||
echo "no ports available"
참고로 이것은 내 제품의 출력 형식입니다 ss -nat
. 따라서 cut -b47-
"라는 주제를 다루는 것이 적절합니다.포트.
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 127.0.0.1:9292 *:*
LISTEN 0 9 *:21 *:*
LISTEN 0 10 192.168.1.2:53 *:*
LISTEN 0 128 192.168.1.2:8000 *:*
ESTAB 0 0 127.0.0.1:8000 127.0.0.1:38587
TIME-WAIT 0 0 127.0.0.1:8000 127.0.0.1:38574
LISTEN 0 16 ::1:3493 :::*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 ::1:631 :::*