12

私を困惑させる質問があり、誰かが次のことを達成しようとしたのだろうかと思います:

これが、Linux 環境での「最後の」コマンドの結果であると仮定しましょう。

root  pts/1        192.168.1.10      Wed Feb 10 07:04 - 07:57  (00:52)  
root  pts/2                          Tue Feb  9 22:00 - 00:13  (02:13)   

「ルート」ユーザーが 192.168.1.10 からログインしている場合、特定のアクション (たとえば、変更された MOTD や電子メールの送信など) をセットアップするにはどうすればよいですか。この情報を取得する方法はありますか?

この質問の 2 番目の部分は、上記のチェックをもう少し堅牢にするにはどうすればよいかということです。つまり、次のような場合です。

mary  pts/1        192.168.1.10      Wed Feb 10 07:04 - 07:57  (00:52)  
bob   pts/2                          Tue Feb  9 22:00 - 00:13  (02:13)      

ここで、ユーザー名が「mary」で、ホストが 192.168.1.10 の場合にアクションを実行したいと思います。

どんな提案も歓迎します。

前もって感謝します。

4

6 に答える 6

23

/etc/ssh/sshrc誰かが接続するたびに実行されるいくつかのコマンドを入れることができる特別なファイルがありますssh。私はあなたのためにそれを書きました:

#!/bin/bash

mail=user@domain.tld
monitored_user=root
monitored_ip=x.x.x.x

hostname=$(hostname)

# add a welcome message:
printf >&2 "\nWelcome on $hostname $USER\n"

read -d " " ip <<< $SSH_CONNECTION

[[ $ip == $monitored_ip && $USER == $monitored_user ]] || exit 0

date=$(date "+%d.%m.%Y %Hh%M")
reverse=$(dig -x $ip +short)

mail -s "Connexion of $USER on $hostname" $mail <<EOF

IP: $ip
Reverse: $reverse
Date: $date
EOF

このスクリプトをファイルに入れてから、スクリプトのフルパスを/etc/ssh/sshrc

man ssh

/etc/ssh/sshrc : このファイルのコマンドは、ユーザーのログイン時、ユーザーのシェル (またはコマンド) が開始される直前に ssh によって実行されます。詳細については、sshd(8) マニュアル ページを参照してください。

于 2012-10-08T20:15:09.913 に答える
1

返信ありがとうございます。最終的には、当面は機能する解決策を見つけることができましたが、すぐに指摘する1つの欠陥があります。

/ etc / bashrcファイル(または使用している環境に関係なく/etc/bash.bashrc)に以下を追加しました。

HOST="192.168.0.1"
RHOST=`who am i | sed -n 's/.*(\([^) ]*\).*/\1/p; 1q'`
if [ "$RHOST" == "$HOST" ]; then
        echo "SAY WHAT!"
        #add further actions here if needed
fi

私が前に話していた欠陥は、実際には欠陥ではないかもしれません。すでにシステムにSSHで接続されていて、同じIP上にあるホストにSSHで接続したい場合は、ssh root@your-host who am i「your-host」と出力しますが、そうあるべきだと思います。

言うまでもなく、上記のsedステートメントは、ユーザー名も取得できるように変更できif/else、ニーズに合わせてステートメントを拡張できます。

返信ありがとうございます。

于 2012-10-08T20:18:27.107 に答える
0

ログインの記録であるデフォルトでlast読み取るため、使用しているようです。/var/log/wtmpこのwhoコマンドを使用すると、同じファイルを読み取ることもできますが、必要に応じたインターフェイスを使用できます。

例えば:

$ who --ips /var/log/wtmp | grep '^msw.*127.0.0.1'
msw      pts/2        2012-10-07 15:52 127.0.0.1
msw      pts/3        2012-10-07 15:55 127.0.0.1

これらのセッションはどちらもアクティブではなく、履歴があり、ログに記録されていました。

于 2012-10-08T19:59:38.660 に答える
0

/etc/profileの値に応じて何かを行う、または同等のものを追加できます$SSH_CLIENT

于 2012-10-08T19:47:14.367 に答える
-1

1 つの方法は、単純なスクリプトを定期的に実行することです。

#!/bin/bash
users=$(last | sed -ne '/192\.168\.1\.10/ s/\([^ ]*\).*/\1/p')
for user in $users; do
    sendmail "$user" < email.txt
done

これにより、最後のコマンドが sed にパイプされ、ユーザー リストが抽出され、変数に保存されます$users。sed コマンドは-nフラグを使用するため、指定した内容のみを出力します。まず、指定された IP を含む行を/192\.168\.1\.10/「アドレス」で選択します。これらの行で、スペースの前の文字を抽出しようとし、成功した場合は結果を出力します。

次に、$users変数をループして、それに応じて処理できます。

これを繰り返し呼び出す 1 つの方法は、cron を使用することです。より簡単な方法は、while true; do ./my_script.bash; sleep 60; done.

于 2012-10-08T19:38:55.363 に答える