SSH でサーバーにログインする人が実行するスクリプトがあります。
ユーザーが接続しているIPアドレスを自動的に確認する方法はありますか?
もちろん、ユーザーに質問することもできます(プログラマー向けのツールなので、問題はありません)。
次の名前の環境変数があるかどうかを確認します。
$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
次のコマンドを使用できます。
server:~# pinky
それはあなたにこのような何かを与えるでしょう:
Login Name TTY Idle When Where
root root pts/0 2009-06-15 13:41 192.168.1.133
IPアドレスのみを取得するには、次を試してください。
who am i|awk '{ print $5}'
Linuxマシンで次のコマンドを入力するだけです。
who
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を表示する必要があります。
who | cut -d"(" -f2 |cut -d")" -f1
事前の回答を改善する。ホスト名の代わりに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
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;
}
netstat -tapen | grep ssh | awk '{ print $10}'
出力:
私の実験では2つの#
netstat -tapen | grep ssh | awk '{ print $4}'
iPアドレスを提供します。
出力:
127.0.0.1:22 # in my experiment
しかし、結果は他のユーザーやものと混合されます。さらに作業が必要です。
netstat -tapen | grep ssh | awk '{ print $4}'
「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)} '
Linux:私は誰ですか| awk '{print $ 5}' | sed 's/[()] // g'
AIX:私は誰ですか| awk '{print $ 6}' | sed 's/[()] // g'
netstatは動作します(トップで次のようになります)tcp 0 0 10.x.xx.xx:ssh someipaddress.or.domainame:9379 ESTABLISHED
@Nikhil Katreの答えに1つの親指:
マシンに最後にログインした10人のユーザーを取得する最も簡単なコマンドは、
last|head
です。すべてのユーザーを取得するには、単に
last
コマンドを使用します
who
またはpinky
を使用するものは、基本的に尋ねられたことを行いました。しかし、しかし、彼らは歴史的なセッション情報を与えません。
これは、このチェックを開始したときに既にログインおよびログアウトした人を知りたい場合にも興味深いかもしれません。
マルチユーザーシステムの場合。探しているユーザーアカウントを追加することをお勧めします。
last | grep $USER | head
編集:
私の場合、$ SSH_CLIENTと$ SSH_CONNECTIONの両方が存在しません。
マシンに最後にログインした10人のユーザーを取得する最も簡単なコマンドは、
last|head
です。すべてのユーザーを取得するには、単に
last
コマンドを使用します
通常、/ var/log/messages(またはOSに応じて同様)にユーザー名でgrepできるログエントリがあります。
彼が対話型セッションを開き(つまり、 疑似端末 を割り当て、stdinにアクセスできると仮定すると、 そのデバイスでioctlを呼び出す によってデバイス番号を取得できます(/dev/pts/4711)そして / var/run/utmp (接続元のユーザー名とIPアドレスもあります)でそれを見つけようとします。
たくさんの答えがある古いスレッドですが、私が探していたものはまったくありませんので、私は私の貢献しています:
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」として記録され、ループは終了します。