Lệnh Linux nhận cổng không sử dụng


20

Tôi đang tìm kiếm một lệnh hoặc tập lệnh trả về một cổng không được sử dụng trên hệ thống linux ubfox của tôi. Tôi đã xem trên internet và điều duy nhất tôi tìm thấy là về cổng được sử dụng / Nghe với lệnh Nestat. Rõ ràng một cái gì đó với lệnh netstat sẽ hoạt động nhưng không biết chính xác những gì. Có ý kiến ​​gì không?

Cảm ơn.



1
Tại sao bạn cần phải làm điều đó chính xác? Nếu bạn đang phát triển một máy chủ, bạn có thể liên kết với cổng 0 và HĐH sẽ phân bổ một cổng miễn phí cho bạn, bạn không có gì để tìm kiếm. Nếu không tìm kiếm và sau đó ràng buộc là dễ bị điều kiện chủng tộc. Xem ví dụ stackoverflow.com/questions/1365265/... hoặc stackoverflow.com/questions/1075399/...
Patrick Mevzek

Câu trả lời:


14

netstat -latđưa ra danh sách đầy đủ các cổng nghethiết lập .

Khi một cổng không thuộc bất kỳ trạng thái nào trong số những trạng thái đó không tồn tại cho hệ thống, vì vậy bạn sẽ không tìm thấy lệnh hiển thị danh sách các cổng không được sử dụng.

Hãy nhớ rằng có 65535 cổng, vì vậy mọi thứ không được bật netstat -latlà một cổng không được sử dụng.

Tập lệnh bash sau đây sẽ thực hiện quét đơn giản các cổng tcp và cho bạn biết cái nào đang mở và cái nào được đóng :

#!/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

Nếu bạn lưu nó dưới dạng portscan.sh thì nó phải được chạy dưới dạng ./portscan.sh IP first_port last_port , ví dụ: ./portscan 127.0.0.1 20 135sẽ quét thiết bị cục bộ từ cổng 20 đến 135


7

Ruby 2.x (một lớp lót):

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

Trên máy của tôi ngay bây giờ có in:

42644

Một lời mời tiếp theo được in:

36168

Kỹ thuật này khiến người dùng hiện tại yêu cầu một cổng không được sử dụng (liên kết với cổng "0"), sau đó in ra số cổng mà hệ điều hành cung cấp. Và vì người dùng hiện tại là người hỏi, các cổng dưới 1024 sẽ không được trả về (trừ khi người dùng hiện tại = root).

Tín dụng khi đáo hạn tín dụng - giải pháp này xuất phát từ nhận xét của Franklin Yu trên unix.stackexchange.com Cách dễ nhất để tìm một cổng địa phương không sử dụng là gì?


Làm thế nào tôi có thể gán kết quả của điều này cho một biến trong tập lệnh bash?
Neil Stevens

export PORT = $ (ruby -e 'yêu cầu "socket"; đặt Addrinfo.tcp ("", 0) .bind {| s | s.local_address.ip_port}')
G. Sylvie Davies

3

Tập lệnh bash ngắn tạo ngẫu nhiên một số trong khoảng từ 1025 đến 60000 và các vòng lặp cho đến khi số đó không được tìm thấy trong danh sách các cổng được sử dụng. Đây là một giải pháp bẩn nhanh chóng có sự thiên vị cho các cổng lớn hơn:

CHECK="do while"

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

echo $PORT

Kiểm tra lệnh grep của bạn, xem nhận xét về câu trả lời của adarshr
Nick

2

Lót

Tôi đã kết hợp một lớp lót đẹp, nhanh chóng phục vụ mục đích, cho phép lấy một số cổng tùy ý trong một phạm vi tùy ý (ở đây được chia thành 4 dòng để dễ đọc):

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"

Từng dòng

commlà một tiện ích so sánh các dòng được sắp xếp trong hai tệp. Nó xuất ra ba cột: các dòng chỉ xuất hiện trong tệp đầu tiên, các dòng chỉ xuất hiện trong cột thứ hai và các dòng chung. Bằng cách chỉ định -23chúng tôi triệt tiêu các cột sau và chỉ giữ cột đầu tiên. Chúng ta có thể sử dụng điều này để có được sự khác biệt của hai bộ, được biểu thị dưới dạng một chuỗi các dòng văn bản. Tôi đã học về comm đây .

Tệp đầu tiên là phạm vi cổng mà chúng ta có thể chọn. seqtạo ra một chuỗi các số được sắp xếp từ $FROMđến $TO. Kết quả được dẫn đến commlà tệp đầu tiên sử dụng thay thế quá trình .

Tệp thứ hai là danh sách các cổng được sắp xếp mà chúng ta có được bằng cách gọi sslệnh (với -tnghĩa là các cổng TCP, -anghĩa là tất cả - được thiết lập và lắng nghe - và -nsố - không cố gắng giải quyết, nói, 22thành ssh). Sau đó chúng tôi chỉ chọn cột thứ tư với awk, chứa địa chỉ và cổng cục bộ. Chúng tôi sử dụng cutđể phân tách địa chỉ và cổng với :dấu phân cách và chỉ giữ lại cái sau ( -f2). sscũng đưa ra một tiêu đề, mà chúng ta loại bỏ bằng grepping cho các chuỗi số không trống không dài hơn 5. Sau đó, chúng tôi tuân thủ commyêu cầu của bằng cách nhập sortsố ( -n) và loại bỏ trùng lặp với uniq.

Bây giờ chúng ta có một danh sách sắp xếp các cổng mở, mà chúng ta có thể shufchạy đến sau đó lấy các cổng đầu tiên "$HOWMANY"với head -n.

Thí dụ

Lấy ba cổng mở ngẫu nhiên trong phạm vi riêng tư (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

có thể trở lại ví dụ

54930
57937
51399

Ghi chú

  • chuyển -tvới -utrong ssđể có được cổng UDP miễn phí thay thế.
  • thả shufnếu bạn không quan tâm đến việc lấy một cổng ngẫu nhiên

1
Tôi thích một lớp lót của bạn, phiên bản này phân tích chính xác IPv6, ví dụ [:: 1]: 52792 và sử dụng tùy chọn --no-header thay vì grep. gist.github.com/fstefanov/ff4dcec7ded59514421bf944d1bb9a6f
Filip Stefanov

1

Tôi chỉ cần tìm một cổng không sử dụng ngẫu nhiên duy nhất và không in danh sách của chúng. Đây là giải pháp bash của tôi.

#/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

Và sử dụng nó bằng cách tìm nguồn cung ứng nó

$ . ./random_unused_port.sh; echo $RANDOM_PORT

Tôi thích ý tưởng ở đây, tuy nhiên lệnh grep của bạn sẽ không trả về những gì bạn dự định. Điều tốt là nó sẽ được bảo thủ, nhưng nếu cổng ngẫu nhiên tiếp theo là 2000 và cổng 2000 được mở, nhưng cổng 20000 đang được sử dụng, nó sẽ tiếp tục tìm kiếm, vì vậy kết quả sẽ không phải là toàn bộ các cổng có sẵn.
Nick

1

Có thể một giải pháp khác dựa trên danh sách các cổng được sử dụng:

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)

Các netstatlệnh tạo ra một danh sách tất cả các cổng mở. Các sedlệnh trích xuất số cổng, mà đang được sử dụng và sort/ uniqlợi nhuận xây dựng một danh sách uniq của cổng mở. Bước thứ hai là tạo danh sách các số cổng bắt đầu từ 1 và kết thúc ở 1000 (các cổng dành riêng) và một danh sách bổ sung của tất cả các số cổng bắt đầu từ 1 đến 65535. Danh sách cuối cùng chỉ chứa tất cả các cổng có sẵn và uniq -usẽ trích xuất chúng . Cuối cùng, shuf -n 1sẽ chọn một cổng ngẫu nhiên trong danh sách đầy đủ các cổng có sẵn. Tuy nhiên, sẽ có một điều kiện cuộc đua, trước khi người ta có thể đặt trước cảng.


1

Tôi cần tìm cổng mở tiếp theo bắt đầu từ số cổng; đây là nỗ lực của tôi bằng cách sử dụng giải pháp của @Tara.

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

0

Nếu 54321 là cổng của bạn, hãy chạy:

sudo netstat -ap |grep 54321

Một số biến thể của việc sử dụng netstat có thể được tìm thấy ở đây .


Lệnh này sẽ chỉ cho tôi xem cổng 54321 có được sử dụng hay không. Những gì tôi muốn là tìm thấy cổng không sử dụng.
dùng2429082

Không sử dụng là mơ hồ. Bạn muốn kiểm tra cổng nào có sẵn để nghe? Hoặc cổng nào có sẵn để kết nối? Bất kỳ thứ gì không được sử dụng đều có sẵn. Là người dùng, bạn có thể sử dụng những người ở trên 1024, với quyền root, bạn cũng có thể sử dụng những người dưới 1024.
Overmind
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.