Bash를 사용하여 특정 범위에서 사용 가능한 첫 번째 포트를 선택하는 가장 짧은 방법은 무엇입니까?

Bash를 사용하여 특정 범위에서 사용 가능한 첫 번째 포트를 선택하는 가장 짧은 방법은 무엇입니까?

목적:범위에서 사용 가능한 첫 번째 포트를 선택합니다. 예를 들어 포트 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                     :::*     

관련 정보