web-dev-qa-db-ja.com

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

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

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

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

139
flybywire

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

$SSH_CLIENT 

OR

$SSH_CONNECTION

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

IPを抽出します。

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

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

server:~# pinky

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

Login      Name                 TTY    Idle   When                 Where 

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

IPアドレスのみを取得するには、次を試してください。

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

Linuxマシンで次のコマンドを入力するだけです。

who
18
Bangar
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を表示する必要があります。

5
Spindrift
 who | cut -d"(" -f2 |cut -d")" -f1
4
danilo

事前の回答を改善する。ホスト名の代わりに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
3
SeeBenClick

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;
}
2
vineetv2821993
netstat -tapen | grep ssh | awk '{ print $10}'

出力:

私の実験では2つの#

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

iPアドレスを提供します。

出力:

127.0.0.1:22 # in my experiment

しかし、結果は他のユーザーやものと混合されます。さらに作業が必要です。

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

「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)} '

1
Nex

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

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

1
pfrandsen

netstatは動作します(トップで次のようになります)tcp 0 0 10.x.xx.xx:ssh someipaddress.or.domainame:9379 ESTABLISHED

1
aric

@Nikhil Katreの答えに1つの親指:

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

すべてのユーザーを取得するには、単にlastコマンドを使用します

whoまたはpinkyを使用するものは、基本的に尋ねられたことを行いました。しかし、しかし、彼らは歴史的なセッション情報を与えません。

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

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

last | grep $USER | head

編集:

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

0
Kangqiao Zhao

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

すべてのユーザーを取得するには、単にlastコマンドを使用します

0
Nikhil Katre

通常、/ var/log/messages(またはOSに応じて同様)にユーザー名でgrepできるログエントリがあります。

0

彼が対話型セッションを開き(つまり、 疑似端末 を割り当て、stdinにアクセスできると仮定すると、 そのデバイスでioctlを呼び出す によってデバイス番号を取得できます(/dev/pts/4711)そして / var/run/utmp (接続元のユーザー名とIPアドレスもあります)でそれを見つけようとします。

0
mihi

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

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
Andrej