SSHセッションでクライアントのIPアドレスを見つける


166

SSHでサーバーにログインするユーザーが実行するスクリプトがあります。

ユーザーが接続しているIPアドレスを自動的に見つける方法はありますか?

もちろん、私はユーザーに質問することもできます(これはプログラマー用のツールなので、問題ありません)。


回答:


267

次の名前の環境変数があるかどうかを確認します。

$SSH_CLIENT 

または

$SSH_CONNECTION

(またはその他の環境変数)。ユーザーがログインすると設定されます。次に、ユーザーログインスクリプトを使用して処理します。

IPを抽出します。

$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4

@cwdこのコマンドでipを置き換えたいのですが "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP"は可能ですか?
wutzebaer 2015

2
これはREMOTEHOSTでした。
dramzy 2016

5
sudoされていないユーザーでのみ機能します。たとえば、sshユーザーがいてルートにエスカレートすると、新しいシェルが作成され、これらの変数は失われます。ただし、ツリーをたどって元のssh pidを見つけ、/ proc / $ PID / environから変数を取得できない場合
Andrej

5
stackoverflow.com/questions/428109/extract-substring-in-bashのおかげで、この答えは単純に改善できます${SSH_CLIENT%% *}
Jeff

@Andrejが調べるsudo -E
Jeff

105

次のコマンドを使用できます。

server:~# pinky

それはあなたにこのような何かを与えるでしょう:

Login      Name                 TTY    Idle   When                 Where 

root       root                 pts/0         2009-06-15 13:41     192.168.1.133

13
それは素晴らしいです:-)もう一度オタクのユーモア。によるとpinky --helpA lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
クリスウッズ

出力の「Where」にIPアドレスではなくマシン名のみが表示されるのはなぜですか?
isaganiesteron 2014

おそらくあなたはあなたのマシンで設定されたネームサーバーを得ました。
vncprado 2015年

pinkyは、自分だけでなく、ログインしているすべてのユーザーを表示ます
Andrej

33

次の方法でIPアドレスのみを取得します。

who am i|awk '{ print $5}'

whoamiと書けば、ログインしているユーザーの名前がわかるでしょう。申し訳ありませんが、5つ目やIPはありません。whoamiは便利なコマンドです
ジェラール

15
who am i!= whoami少なくとも私のLinuxでは。5つ目は、クライアントのホスト名です。
kbulgrien 2014年

5
疑問に思う他の人のwho am iために:のマンページはwho言う:If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.。したがって、実際には2つの単語を含むすべてが機能しますwho likes icecream
jmiserez 2015年

3
この回答に基づいて、who -m --ips|awk '{print $5}'IPのみを使用し、reverse-dnsの回答を使用しないように減らしました。の助けをありがとうwho am i
Yvan 2017

1
tmuxで失敗する: who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche



5
who am i | awk '{print $5}' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'


export DISPLAY=`who am i | awk '{print $5}' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'`:0.0

これを使用して、ssh経由でログインするときにセッションのDISPLAY変数を決定し、リモートXを表示する必要があります。


.htaccessファイルにIPを追加するための便利な1つのライナー。ありがとうございました。FreeBSDを変更しましたwho am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' 。最後の部分はドットをエスケープします。
Olivier-interfaSys 2014

5

以前の答えを改善する。ホスト名の代わりにIPアドレスを指定します。--ipsはOS Xでは使用できません。

who am i --ips|awk '{print $5}' #ubuntu 14

より普遍的な、OS X 10.11の$ 5から$ 6への変更:

WORKSTATION=`who -m|awk '{print $5}'|sed 's/[()]//g'`
WORKSTATION_IP=`dig +short $WORKSTATION`
if [[ -z "$WORKSTATION_IP" ]]; then WORKSTATION_IP="$WORKSTATION"; fi
echo $WORKSTATION_IP

2
netstat -tapen | grep ssh | awk '{ print $4}'

CentOS 6.9(net-tools 1.60 netstat 1.42)では動作しません(No info could be read for "-p": geteuid()=507 but you should be root.)
Jeff

@ジェフはsudo ss -tapen | grep ssh | awk '{ print $4}'|grep -v ':22$'機能しますか?
Alexx Roche

2

SSHライブラリ(https://code.google.com/p/sshxcute)を介してプログラムで取得できます。

public static String getIpAddress() throws TaskExecFailException{
    ConnBean cb = new ConnBean(host, username, password);
    SSHExec ssh = SSHExec.getInstance(cb);
    ssh.connect();
    CustomTask sampleTask = new ExecCommand("echo \"${SSH_CLIENT%% *}\"");
    String Result = ssh.exec(sampleTask).sysout;
    ssh.disconnect();   
    return Result;
}

1

netstatが機能します(先頭はこのようなものです)tcp 0 0 10.x.xx.xx:ssh someipaddress.or.domainame:9379 ESTABLISHED


この答えを本当にありがとう、私は結局 'netstat | grep ssh '。
ロスエイケン

セキュリティ上の理由から、これは悪いことです。あなただけでなく、だれでもそのポートに接続できるからです。
CrazyCasta 2013

1
netstat -tapen | grep ssh | awk '{ print $10}'

出力:

私の実験では#

netstat -tapen | grep ssh | awk '{ print $4}' 

IPアドレスを指定します。

出力:

127.0.0.1:22 # in my experiment

しかし、結果は他のユーザーやものと混合されます。もっと仕事が必要です。


私のnetstatはIPv6に対して切り捨てられたアドレスしか提供せず、「127.0.0.1:22」はクライアントではなくサーバーです(質問で指定されていました)
Alexx Roche

1

たくさんの答えがある古いスレッドですが、私が探していたものはまったくないので、私は私の貢献しています:

sshpid=$$
sshloop=0
while [ "$sshloop" = "0" ]; do
        if [ "$(strings /proc/${sshpid}/environ | grep ^SSH_CLIENT)" ];
then
                read sshClientIP sshClientSport sshClientDport <<< $(strings /proc/${sshpid}/environ | grep ^SSH_CLIENT | cut -d= -f2)
                sshloop=1
        else
                sshpid=$(cat /proc/${sshpid}/status | grep PPid | awk '{print $2}')
                [ "$sshpid" = "0" ] && sshClientIP="localhost" && sshloop=1
        fi
done

この方法は、直接ssh、sudoedユーザー、およびスクリーンセッションと互換性があります。SSH_CLIENT変数でpidが見つかるまでプロセスツリーをたどり、そのIPを$ sshClientIPとして記録します。ツリーから離れすぎると、IPを「localhost」として記録し、ループを終了します。



0

Linux:私は誰ですか| awk '{print $ 5}' | sed 's / [()] // g'

AIX:私は誰ですか| awk '{print $ 6}' | sed 's / [()] // g'


0

「myusername」アカウントのSSH接続を検索します。

最初の結果文字列を取得します。

5列目を取る;

":"で分割し、最初の部分を返します(ポート番号は不要です。IPのみが必要です)。

netstat -tapen | grep "sshd:myusername" | ヘッド-n1 | awk '{split($ 5、a、 ":"); 印刷a [1]} '


別の方法:

私は誰ですか| awk '{l = length($ 5)-2; print substr($ 5、2、l)} '


sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'私のsshクライアントの出身地2a02とあなたの「別の方法:」は言うtmux(2445).%3
Alexx Roche


0

@Nikhil Katreの回答を一挙に挙げてください。

マシンにログインしている最後の10人のユーザーを取得する最も簡単なコマンドは、 last|headです。

すべてのユーザーを取得するには、lastコマンドを使用するだけです

基本的にお伺いしたものを利用しwhoたりpinkyやった方。しかし、しかし、彼らは過去のセッション情報を提供しません。

これは、このチェックを開始したときに、すでにログインおよびログアウトしたばかりのユーザーを知りたい場合にも興味深いかもしれません。

マルチユーザーシステムの場合。探しているユーザーアカウントを追加することをお勧めします。

last | grep $USER | head

編集:

私の場合、$ SSH_CLIENTと$ SSH_CONNECTIONの両方が存在しません。


0

マシンにログインしている最後の10人のユーザーを取得する最も簡単なコマンドは、last|headです。すべてのユーザーを取得するには、lastコマンドを使用するだけです


0

who -m --ipsDebian 10 から次の出力が得られます。

root pts / 0 Dec 4 06:45 123.123.123.123

新しい列が追加されたようです。{print $5}つまり、「5番目の列を取る」の試行は機能しなくなります。

これを試して:

who -m --ips | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'

ソース:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.