私は自分のLinuxマシン上のさまざまなサーバへのたくさんのSSHトンネル(データベース、Webサーバなどへのトンネリングのために)を使っています、そして現在のオープントンネルのリストをシェルスクリプトで見るのは本当に便利でしょう。
私はnetstat上のgrepで以下の行に沿ってローカル接続を識別することができます。
netstat -n --protocol inet | grep ':22'
しかし、これは私にそれが接続されているリモートポートを表示しません(そして明らかにトンネリングされていない標準的なSSH接続を含みます)
UPDATE:答えは問題ありませんが、接続しているリモートポートは表示されません。たとえば、私はよくmysqlへのトンネルを通り抜けています。サーバー上でlocalhost:3308マッピング:3306と言っています。通常、私は自分が選んだローカルポートから推測することができますが、両方にアクセスできるのはいいでしょう。
何か案は?
ssh
によって作成されたトンネルのみを一覧表示したい場合は、
% Sudo lsof -i -n | egrep '\<ssh\>'
ssh 19749 user 3u IPv4 148088244 TCP x.x.x.x:39689->y.y.y.y:22 (ESTABLISHED)
ssh 19749 user 4u IPv6 148088282 TCP [::1]:9090 (LISTEN)
ssh 19749 user 5u IPv4 148088283 TCP 127.0.0.1:9090 (LISTEN)
(これは-L 9090:localhost:80トンネルになります)
sshd
に対して行われたトンネル/接続を見たい場合は:
% Sudo lsof -i -n | egrep '\<sshd\>'
sshd 15767 root 3u IPv4 147401205 TCP x.x.x.x:22->y.y.y.y:27479 (ESTABLISHED)
sshd 15842 user 3u IPv4 147401205 TCP x.x.x.x:22->y.y.y.y:27479 (ESTABLISHED)
sshd 15842 user 9u IPv4 148002889 TCP 127.0.0.1:33999->127.0.0.1:www (ESTABLISHED)
sshd 1396 user 9u IPv4 148056581 TCP 127.0.0.1:5000 (LISTEN)
sshd 25936 root 3u IPv4 143971728 TCP *:22 (LISTEN)
sshデーモンはポート22(最後の行)で待機し、2つのサブプロセス(最初の2行、 'user'のログイン)が生成され、-Rトンネルがポート5000に作成され、-Lトンネルがmyポートから転送しますlocalhostからlocalhostへのマシン:80(www)。
このコマンドを試してください。役に立つかもしれません:
ps aux | grep ssh
厳密にはあなたの問題に対する解決策ではありませんが、時々また便利です:
SSHセッション内から:
そのセッションでトンネルを介して開かれているすべての接続のリストを表示します。
netstat -tpln | grep ssh
編集:@akiraコメントの例:
(header added, tested on Debian wheezy)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:1443 0.0.0.0:* LISTEN 4036/ssh
SSH(SSHdではなく)はローカルTCPポート1443をリッスンしています。
これはこの質問に対するGoogleのトップの検索結果であるため、ここに回答を掲載します。私は結果をフィルタリングしながら一晩中起きて、このフォーマットであなたのリバースSSHトンネルだけを示す長い複雑なコマンドを思い付きました:
publicipaddress:remoteforwardedport
これが、Ubuntu Server 12を実行しているコードです。ローカルポート5900をパブリックsshサーバーに転送するリバースsshトンネルを実行しています。このniftyコマンドは、すべてのパブリックIPアドレスをリモートポートとともに表示します。
Sudo lsof -i -n | egrep '\<sshd\>' | grep -v ":ssh" | grep LISTEN | sed 1~2d | awk '{ print $2}' | while read line; do Sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done
/sbin/ip tunnel list # replacement for the deprecated iptunnel command
私はlsofが好きではないので、私は別の方法を提案します(他の人が教えてくれました:)):
$ netstat -l | grep ssh
このようにして、LISTENモードで開かれている(そしてssh
によってデフォルトで省略されている)netstat
によって作成されたsshトンネルを表示します。
report_local_port_forwardings() {
# -a ands the selection criteria (default is or)
# -i4 limits to ipv4 internet files
# -P inhibits the conversion of port numbers to port names
# -c /regex/ limits to commands matching the regex
# -u$USER limits to processes owned by $USER
# http://man7.org/linux/man-pages/man8/lsof.8.html
# https://stackoverflow.com/q/34032299
echo
echo "LOCAL PORT FORWARDING"
echo
echo "You set up the following local port forwardings:"
echo
lsof -a -i4 -P -c '/^ssh$/' -u$USER -s TCP:LISTEN
echo
echo "The processes that set up these forwardings are:"
echo
ps -f -p $(lsof -t -a -i4 -P -c '/^ssh$/' -u$USER -s TCP:LISTEN)
}
report_remote_port_forwardings() {
echo
echo "REMOTE PORT FORWARDING"
echo
echo "You set up the following remote port forwardings:"
echo
ps -f -p $(lsof -t -a -i -c '/^ssh$/' -u$USER -s TCP:ESTABLISHED) | awk '
NR == 1 || /R [[:digit:]]+:\S+:[[:digit:]]+.*/
'
}
report_local_port_forwardings
report_remote_port_forwardings
出力例:
LOCAL PORT FORWARDING
You set up the following local port forwardings:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 10086 user 7u IPv4 1924960 0t0 TCP localhost:2301 (LISTEN)
ssh 10086 user 9u IPv4 1924964 0t0 TCP localhost:2380 (LISTEN)
ssh 10086 user 11u IPv4 1924968 0t0 TCP localhost:2381 (LISTEN)
The processes that set up these forwardings are:
UID PID PPID C STIME TTY TIME CMD
user 10086 7074 0 13:05 pts/21 00:00:00 ssh -N ssh.example.com
REMOTE PORT FORWARDING
You set up the following remote port forwardings:
UID PID PPID C STIME TTY STAT TIME CMD
user 7570 30953 0 11:14 pts/18 S 0:00 ssh -N -R 9000:localhost:3000 ssh.example.com
#!/ bin/csh -f echo SSHトンネル接続 echo foreach f( `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grepリスト| cut -d "" -f45- | cut -d "/" -f1`) set ip = `netstat -an -p | grep tcp grep sshd grep -v :: | grep -v 0:22 | grep grep $ f | cut -d "" -f20- | cut -d ":" -f1` #set h = `grep -a" $ ip "/htdocs/impsip.html | grep br | cut -d "" -f2` echo -n "$ ip" echo `netstat -an -p | grep tcp grep sshd grep -v :: | grep -v 0:22 | grep LISTEN | grep grep $ f | cut -d ":" -f2 | cut -d "" -f1` #echo "$ h" end