짧막 한 농담
나는 목적을 신속하게 제공하는 멋진 원 라이너를 구성하여 임의의 범위에서 임의의 수의 포트를 잡을 수 있습니다 (여기에서는 가독성을 위해 4 줄로 나뉩니다).
comm -23 \
<(seq "$FROM" "$TO" | sort) \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -u) \
| shuf | head -n "$HOWMANY"
한 줄씩
comm
알파벳순으로 정렬되어야하는 두 파일의 행을 비교하는 유틸리티입니다. 첫 번째 파일에만 나타나는 행, 두 번째 열에 만 나타나는 행 및 공통 행의 세 가지 열을 출력합니다. 지정 -23
하면 후자의 열을 억제하고 첫 번째 열만 유지합니다. 이를 사용하여 일련의 텍스트 줄로 표현 된 두 세트의 차이를 얻을 수 있습니다. 나는 comm
여기 에 대해 배웠다 .
첫 번째 파일은 선택할 수있는 포트 범위입니다. seq
에서 $FROM
까지 정렬 된 숫자 시퀀스를 생성합니다 $TO
. 결과는 알파벳순 (숫자 대신)으로 정렬되고 프로세스 대체를comm
사용하여 첫 번째 파일로 파이프됩니다 .
두 번째 파일은 우리가 호출하여받는 것이, 포트의 정렬 된 목록입니다 ss
명령 (와 -t
, 의미 TCP 포트 -a
- 설립 듣기 - 모든 의미하는 -n
숫자 - 말하자면, 해결하려고하지 않습니다 22
에 ssh
). 그런 다음로 awk
로컬 주소와 포트가 포함 된 네 번째 열만 선택합니다 . 우리 cut
는 :
구분자와 함께 주소와 포트를 분할 하고 후자를 유지하는 데 사용합니다 ( -f2
). ss
또한 grep
5를 넘지 않는 비어 있지 않은 숫자 시퀀스를 핑하여 제거하는 헤더를 출력합니다 . 그런 다음 중복없이 ing comm
하여 요구 사항 을 준수 sort
합니다 -u
.
이제 우리는 우리가 할 수있는, 열린 포트의 정렬 된 목록이 shuf
다음 첫 번째 잡아 FLE "$HOWMANY"
을 가진 사람을 head -n
.
예
개인 범위에서 3 개의 임의 개방 포트를 가져옵니다 (49152-65535)
comm -23 <(seq 49152 65535 | sort) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort -u) | shuf | head -n 3
예를 들어 반환 할 수 있습니다
54930
57937
51399
노트
- 스위치
-t
와 -u
의 ss
대신 무료 UDP 포트를 얻을 수 있습니다.
- 교체
shuf
로 sort -n
사용 가능한 포트를 수치 적으로 분류하는 대신 무작위로 얻을 선호하는 경우
-n
netstat와 더 선택적인 grep에 가장 적습니다 ). 이를 수행하는 방법은 필요한 모드로 포트를 열려고 시도하고 사용할 수없는 경우 다른 포트를 시도하는 것입니다.