리눅스 커맨드 미사용 포트


20

우분투 리눅스 시스템에서 사용하지 않는 포트를 반환하는 명령이나 스크립트를 찾고 있습니다. 나는 인터넷을 보았고 내가 찾은 유일한 것은 nestat 명령으로 사용 / 청취 포트에 관한 것입니다. 분명히 netstat 명령으로 무언가가 작동하지만 정확히 무엇인지 모릅니다. 어떻게 생각해?

감사.



1
왜 정확히 그렇게해야합니까? 서버를 개발하는 경우 포트 0에 바인딩 할 수 있고 OS가 사용 가능한 포트를 할당하므로 검색 할 내용이 없습니다. 그렇지 않으면 검색 및 바인딩이 경쟁 조건에 취약합니다. 예를 들어 stackoverflow.com/questions/1365265/… 또는 stackoverflow.com/questions/1075399/…
Patrick Mevzek

답변:


14

netstat -lat청취설정된 포트 의 전체 목록을 제공합니다 .

포트가 해당 상태에없는 경우 시스템에 존재하지 않으므로 사용하지 않는 포트 목록을 표시하는 명령을 찾을 수 없습니다.

65535 개의 포트가 있으므로 켜져 netstat -lat있지 않은 포트는 사용되지 않는 포트입니다.

다음 bash 스크립트는 tcp 포트 의 간단한 스캔을 수행하고 열려 있고 닫힌 것을 알려줍니다 .

#!/bin/bash
IP=$1
first_port=$2
last_port=$3
function scanner

{
for ((port=$first_port; port<=$last_port; port++))
        do
                (echo >/dev/tcp/$IP/$port)> /dev/null 2>&1 && echo $port open || echo "$port closed"
        done
}

scanner

portscan.sh 로 저장하면 ./portscan.sh IP first_port last_port 로 실행해야합니다 . 예를 들면 다음과 같습니다. ./portscan 127.0.0.1 20 135포트 20에서 135까지 로컬 장비를 스캔합니다.


7

루비 2.x (한 줄짜리) :

ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'

내 컴퓨터에서 인쇄 된 내용 :

42644

후속 호출이 인쇄되었습니다.

36168

이 기술은 현재 사용자가 사용하지 않는 포트 (포트 "0"에 바인딩)를 요청한 다음 운영 체제가 제공 한 포트 번호를 인쇄합니다. 현재 사용자가 묻는 사용자이므로 1024 미만의 포트는 반환되지 않습니다 (현재 사용자 = root가 아닌 경우).

크레딧이 필요한 곳의 크레딧-이 솔루션은 Franklin Yu의 unix.stackexchange.com의 의견에서 비롯되었습니다. 사용하지 않는 로컬 포트를 찾는 가장 쉬운 방법은 무엇입니까?


이 결과를 bash 스크립트의 변수에 어떻게 할당 할 수 있습니까?
닐 스티븐스

export PORT = $ (ruby -e '소켓 "필요; Addrinfo.tcp (" ", 0) .bind {| s | s.local_address.ip_port}')
G. Sylvie Davies

3

1025에서 60000 사이의 숫자를 임의로 생성하고 사용 된 포트 목록에 해당 숫자가 없을 때까지 반복되는 짧은 bash 스크립트. 이것은 더 큰 포트에 치우친 빠른 더러운 솔루션입니다.

CHECK="do while"

while [[ ! -z $CHECK ]]; do
    PORT=$(( ( RANDOM % 60000 )  + 1025 ))
    CHECK=$(sudo netstat -ap | grep $PORT)
done

echo $PORT

grep 명령을 확인하고 adarshr answer에 대한 의견 참조
Nick

2

짧막 한 농담

나는 목적을 신속하게 제공하는 멋진 원 라이너를 구성하여 임의의 범위에서 임의의 수의 포트를 잡을 수 있습니다 (여기에서는 가독성을 위해 4 줄로 나뉩니다).

comm -23 \
<(seq "$FROM" "$TO") \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -n | uniq) \
| shuf | head -n "$HOWMANY"

한 줄씩

comm두 파일에서 정렬 된 줄을 비교하는 유틸리티입니다. 첫 번째 파일에만 나타나는 행, 두 번째 열에 만 나타나는 행 및 공통 행의 세 가지 열을 출력합니다. 지정 -23하면 후자의 열을 억제하고 첫 번째 열만 유지합니다. 이를 사용하여 일련의 텍스트 줄로 표현 된 두 세트의 차이를 얻을 수 있습니다. 나는 comm 여기 에 대해 배웠다 .

첫 번째 파일은 선택할 수있는 포트 범위입니다. seq에서 $FROM까지 정렬 된 숫자 시퀀스를 생성합니다 $TO. 결과는 프로세스 대체를comm 사용하여 첫 번째 파일로 파이프됩니다 .

두 번째 파일은 우리가 호출하여받는 것이, 포트의 정렬 된 목록입니다 ss(와 명령을 -t의미 TCP 포트 -a- 설립 듣기 - 모든 의미 -n, 해결, 말을하지 마세요 - 숫자 22ssh). 그런 다음로 awk로컬 주소와 포트가 포함 된 네 번째 열만 선택합니다 . 우리 cut:구분자와 함께 주소와 포트를 분할 하고 후자를 유지하는 데 사용합니다 ( -f2). ss또한 grep비어 있지 않은 5 개 이하의 숫자 시퀀스에 대해 ping 하여 헤더를 출력합니다 . 그런 다음 숫자 ( )를 사용하여와 중복을 제거하여 comm요구 사항 을 준수 sort합니다 .-nuniq

이제 우리는 우리가 할 수있는, 열린 포트의 정렬 된 목록이 shuf다음 첫 번째 잡아 FLE "$HOWMANY"을 가진 사람을 head -n.

개인 범위에서 3 개의 임의 개방 포트를 가져옵니다 (49152-65535)

comm -23 <(seq 49152 65535) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort | uniq) | shuf | head -n 3

예를 들어 반환 할 수 있습니다

54930
57937
51399

노트

  • 전환 -t-uss대신 무료 UDP 포트를 얻을 수 있습니다.
  • shuf임의의 포트를 잡고 싶지 않다면 드롭

1
나는 당신의 one-liner를 좋아합니다.이 버전은 IPv6을 올바르게 구문 분석합니다 : [:: 1] : 52792 gist.github.com/fstefanov/ff4dcec7ded59514421bf944d1bb9a6f
Filip Stefanov

1

무작위로 사용되지 않는 단일 포트를 찾아서 목록을 인쇄하지 않아야했습니다. 여기 내 bash 솔루션이 있습니다.

#/bin/bash

function random_unused_port {
    local port=$(shuf -i 2000-65000 -n 1)
    netstat -lat | grep $port > /dev/null
    if [[ $? == 1 ]] ; then
        export RANDOM_PORT=$port
    else
        random_unused_port
    fi
}

random_unused_port

그리고 그것을 소싱하여 사용하십시오

$ . ./random_unused_port.sh; echo $RANDOM_PORT

나는 여기서 아이디어를 좋아하지만, grep 명령은 의도 한 것을 반환하지 않을 것입니다. 좋은 점은 보수적이지만 다음 임의의 포트가 2000이고 포트 2000이 열려 있지만 포트 20000이 사용 중이면 계속 찾고 있으므로 결과는 사용 가능한 전체 포트 범위가 아닙니다.
Nick

1

사용 된 포트 목록을 기반으로 한 다른 솔루션 일 수 있습니다.

function random_unused_port {
   (netstat --listening --all --tcp --numeric | 
    sed '1,2d; s/[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*:\([0-9]*\)[[:space:]]*.*/\1/g' |
    sort -n | uniq; seq 1 1000; seq 1 65535
    ) | sort -n | uniq -u | shuf -n 1
}

RANDOM_PORT=$(random_unused_port)

netstat명령은 열려있는 모든 포트 목록을 생성합니다. 이 sed명령은 사용중인 포트 번호를 추출하고 sort/ uniqconstruct는 열린 포트의 uniq 목록을 리턴합니다. 두 번째 단계는 1에서 시작하여 1000에서 완료되는 포트 번호 목록 (예약 된 포트)과 1에서 65535까지 시작하는 모든 포트 번호의 추가 목록을 생성하는 것입니다. 최종 목록에는 사용 가능한 모든 포트가 한 번만 포함 uniq -u되며 추출됩니다. . 마지막 shuf -n 1으로 사용 가능한 전체 포트 목록에서 하나의 임의 포트를 선택합니다. 그럼에도 불구하고 항구를 예약하기 전에 경쟁 조건이 있습니다.


1

포트 번호에서 시작하여 다음에 열린 포트를 찾아야했습니다. @Taras 솔루션을 사용하는 시도는 다음과 같습니다.

_check="placeholder"
START_FROM=1900
PORT=$(( ( "$RANDOM" % 1000 ) + $START_FROM ))
while [[ ! -z "${_check}" ]]; do
    ((PORT++))
    _check=$(ss -tulpn | grep ":${PORT}")
done

0

54321이 포트 인 경우 다음을 실행하십시오.

sudo netstat -ap |grep 54321

netstat 사용의 일부 변형은 여기 에서 찾을 수 있습니다 .


이 명령은 포트 54321의 사용 여부를 보여줍니다. 내가 찾는 것은 사용하지 않는 포트입니다.
user2429082

미사용입니다. 청취 할 수있는 포트를 확인하고 싶습니까? 또는 어떤 포트를 연결할 수 있습니까? 사용하지 않는 것은 모두 가능합니다. 사용자는 1024 이상의 것을 루트로 사용할 수 있으며 1024 이하의 것을 사용할 수도 있습니다.
Overmind
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.