2015-06-10 53 views
3

我通常使用定影命令檢查PID打開某些TCP端口像以下如何確定哪個進程正在打開某個TCP端口?

fuser 22/tcp //To get pid opening the 22 tcp port 

我有一個基準板,其上運行的嵌入式Linux。 它已經爲ssh連接打開了22個tcp端口。 但fuser不顯示關於22端口的任何輸出。 所以我嘗試了另一個ssh守護進程來打開322端口,然後試圖檢查使用fuser pid,它工作正常。

[email protected]:~# netstat -nlt | grep 22 
tcp  0  0 0.0.0.0:4224   0.0.0.0:*    LISTEN 
tcp  0  0 0.0.0.0:322    0.0.0.0:*    LISTEN 
tcp  0  0 :::322     :::*     LISTEN 
tcp  0  0 :::22     :::*     LISTEN 

[email protected]:~# fuser 322/tcp 
351 

[email protected]:~# ps -ef | grep 351 
root  351  1 0 01:46 ?  00:00:00 /usr/sbin/dropbear -r /etc/dropbear/dropbear_rsa_host_key -p 322 -B 

root  379 315 0 02:11 ttymxc3 00:00:00 grep 351 


[email protected]:~# fuser 22/tcp 
==> This output nothing !! 

如何確定哪個進程正在打開tcp 22端口。 (中板,lsof的命令不可用和netstat的..沒有-p選項。)

回答

2

你已經安裝我/procbashreadlink均已安裝, 你可以寫一個小的bash腳本解析/proc/net/tcp,並掃描/proc/*/fd/找到相應的套接字。

我對嵌入式linux並不是很熟悉,但如果找不到readlink,它可能包含在busybox中。

/proc/net/tcp是一樣的東西

sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 
0: 00000000:4E7A 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0  0 13128 1 ffff8800cf960740 99 0 0 10 0 

local_addressHOST:PORT十六進制字符串,所以當你要搜索的TCP 22端口:0016腳本搜索。

一旦它找到包含:0016的行local_address, inode是對應的套接字號。

然後它使用readlink命令搜索具有套接字號的/proc/*/fd/*

#!/bin/bash 
PORT="$1" 
HEX_PORT=$(printf %04X $PORT) 
INODE="" 
if ! [ "$PORT" ];then 
    echo "usage $0 [PORT]" 
    exit 
fi 
while read num host_port _ _ _ _ _ _ _ inode _; do 
    if [[ $host_port =~ :"$HEX_PORT"$ ]];then 
    INODE=$inode 
    fi 
done < /proc/net/tcp 
if ! [ "$INODE" ];then 
    echo "no process using $PORT" 
    exit 
fi 
for fn in /proc/[1-9]*/fd/*; do 
    if [ "$(readlink $fn)" = "socket:[$INODE]" ];then 
    tmp=${fn%/fd*} 
    echo ${tmp#/proc/} 
    fi 
done 
0

Thanks @ymonad !! :) 正如你所說,我已經能夠得到像下面這樣的端口對應的pid。

[email protected]:~# cat /proc/net/tcp 
    sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 

    0: 00000000:1080 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0  0 1018 1 d8d90a00 100 0 0 10 0 

    1: 00000000:0DA2 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0  0 842 1 d8d90000 100 0 0 10 0 

    2: 00000000:006F 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0  0 2515 1 d8dc8000 100 0 0 10 0 

    3: 0100007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0  0 877 1 d8d90500 100 0 0 10 0 

[email protected]:~# cat /proc/net/tcp6 
    sl local_address       remote_address      st tx_queue rx_queue tr tm->when retrnsmt uid timeo 
ut inode 
    0: 00000000000000000000000000000000:006F 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000  0 
0 2518 1 d8dd0000 100 0 0 10 -1 
    1: 00000000000000000000000001000000:0035 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000  0 
0 881 1 d8de0000 100 0 0 10 -1 
    2: 00000000000000000000000000000000:0016 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000  0 
0 4933 1 d8da0000 100 0 0 10 -1 

你的shell腳本工作正常,它可以像下面那樣正確得到pid。

[email protected]:~# /tmp/find.sh 22 
1 

奇怪的是結果pid是1 這是init進程;;

UID  PID PPID C STIME TTY   TIME CMD 
root   1  0 0 04:21 ?  00:00:04 /sbin/init 

我想我需要弄清楚init進程如何打開22個TCP端口。 真的很感謝你。 :D我學到了很多。再次感謝 !!

相關問題