우분투 리눅스 시스템에서 사용하지 않는 포트를 반환하는 명령이나 스크립트를 찾고 있습니다. 나는 인터넷을 보았고 내가 찾은 유일한 것은 nestat 명령으로 사용 / 청취 포트에 관한 것입니다. 분명히 netstat 명령으로 무언가가 작동하지만 정확히 무엇인지 모릅니다. 어떻게 생각해?
감사.
우분투 리눅스 시스템에서 사용하지 않는 포트를 반환하는 명령이나 스크립트를 찾고 있습니다. 나는 인터넷을 보았고 내가 찾은 유일한 것은 nestat 명령으로 사용 / 청취 포트에 관한 것입니다. 분명히 netstat 명령으로 무언가가 작동하지만 정확히 무엇인지 모릅니다. 어떻게 생각해?
감사.
답변:
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까지 로컬 장비를 스캔합니다.
루비 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의 의견에서 비롯되었습니다. 사용하지 않는 로컬 포트를 찾는 가장 쉬운 방법은 무엇입니까?
나는 목적을 신속하게 제공하는 멋진 원 라이너를 구성하여 임의의 범위에서 임의의 수의 포트를 잡을 수 있습니다 (여기에서는 가독성을 위해 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
, 해결, 말을하지 마세요 - 숫자 22
에 ssh
). 그런 다음로 awk
로컬 주소와 포트가 포함 된 네 번째 열만 선택합니다 . 우리 cut
는 :
구분자와 함께 주소와 포트를 분할 하고 후자를 유지하는 데 사용합니다 ( -f2
). ss
또한 grep
비어 있지 않은 5 개 이하의 숫자 시퀀스에 대해 ping 하여 헤더를 출력합니다 . 그런 다음 숫자 ( )를 사용하여와 중복을 제거하여 comm
요구 사항 을 준수 sort
합니다 .-n
uniq
이제 우리는 우리가 할 수있는, 열린 포트의 정렬 된 목록이 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
과 -u
에 ss
대신 무료 UDP 포트를 얻을 수 있습니다.shuf
임의의 포트를 잡고 싶지 않다면 드롭무작위로 사용되지 않는 단일 포트를 찾아서 목록을 인쇄하지 않아야했습니다. 여기 내 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
사용 된 포트 목록을 기반으로 한 다른 솔루션 일 수 있습니다.
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
/ uniq
construct는 열린 포트의 uniq 목록을 리턴합니다. 두 번째 단계는 1에서 시작하여 1000에서 완료되는 포트 번호 목록 (예약 된 포트)과 1에서 65535까지 시작하는 모든 포트 번호의 추가 목록을 생성하는 것입니다. 최종 목록에는 사용 가능한 모든 포트가 한 번만 포함 uniq -u
되며 추출됩니다. . 마지막 shuf -n 1
으로 사용 가능한 전체 포트 목록에서 하나의 임의 포트를 선택합니다. 그럼에도 불구하고 항구를 예약하기 전에 경쟁 조건이 있습니다.