回答:
次の名前の環境変数があるかどうかを確認します。
$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
${SSH_CLIENT%% *}
sudo -E
次のコマンドを使用できます。
server:~# pinky
それはあなたにこのような何かを与えるでしょう:
Login Name TTY Idle When Where
root root pts/0 2009-06-15 13:41 192.168.1.133
pinky --help
:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
次の方法でIPアドレスのみを取得します。
who am i|awk '{ print $5}'
who am i
!= whoami
少なくとも私のLinuxでは。5つ目は、クライアントのホスト名です。
who am i
ために:のマンページはwho
言う:If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.
。したがって、実際には2つの単語を含むすべてが機能しますwho likes icecream
。
who -m --ips|awk '{print $5}'
IPのみを使用し、reverse-dnsの回答を使用しないように減らしました。の助けをありがとうwho am i
!
who am i|awk '{ print $5}'
(tmux(2445).%3)
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 am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g'
。最後の部分はドットをエスケープします。
以前の答えを改善する。ホスト名の代わりに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
netstat -tapen | grep ssh | awk '{ print $4}'
(No info could be read for "-p": geteuid()=507 but you should be root.)
sudo ss -tapen | grep ssh | awk '{ print $4}'|grep -v ':22$'
機能しますか?
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が機能します(先頭はこのようなものです)tcp 0 0 10.x.xx.xx:ssh someipaddress.or.domainame:9379 ESTABLISHED
netstat -tapen | grep ssh | awk '{ print $10}'
出力:
私の実験では#
netstat -tapen | grep ssh | awk '{ print $4}'
IPアドレスを指定します。
出力:
127.0.0.1:22 # in my experiment
しかし、結果は他のユーザーやものと混合されます。もっと仕事が必要です。
たくさんの答えがある古いスレッドですが、私が探していたものはまったくないので、私は私の貢献しています:
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」として記録し、ループを終了します。
通常、/ var / log / messages(またはOSによっては同様)に、ユーザー名でgrepできるログエントリがあります。
「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
彼がインタラクティブセッションを開き(つまり、疑似端末を割り当て)、標準入力へのアクセス権がある場合、そのデバイスでioctlを呼び出してデバイス番号(/ dev / pts / 4711)を取得し、そのデバイスを見つけようとします。/ var / run / utmp(接続の発信元のユーザー名とIPアドレスもあります)。
@Nikhil Katreの回答を一挙に挙げてください。
マシンにログインしている最後の10人のユーザーを取得する最も簡単なコマンドは、
last|head
です。すべてのユーザーを取得するには、
last
コマンドを使用するだけです
基本的にお伺いしたものを利用しwho
たりpinky
やった方。しかし、しかし、彼らは過去のセッション情報を提供しません。
これは、このチェックを開始したときに、すでにログインおよびログアウトしたばかりのユーザーを知りたい場合にも興味深いかもしれません。
マルチユーザーシステムの場合。探しているユーザーアカウントを追加することをお勧めします。
last | grep $USER | head
編集:
私の場合、$ SSH_CLIENTと$ SSH_CONNECTIONの両方が存在しません。
who -m --ips
Debian 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}'
ソース: