SSHログインおよび/またはログアウトで(システム)スクリプトを実行する


12

ユーザーがSSHを使用してログインし、理想的にはホスト名またはIPとユーザー名を渡すたびに、OpenSSHサーバーがスクリプトを開始するようにします。さらに、セッションが終了する(ユーザー名を渡す)たびにスクリプトを実行したいと思います。これらのスクリプトは、ユーザーのセッションではなく、システム全体で実行する必要があります。

たとえば、を使用してespeak、ログインおよびログアウト時に音声警告を発し、外部ディスプレイに情報を表示します。

私はpam-scriptsパッケージがあることを見てきましたが、これが私が望むことをするのか、それをどのように使用するのかはわかりません。

回答:


10

SSHユーザーに要求するコマンド(または特定のコマンドを与えない場合はシェル)の代わりにコマンドを強制することができます。これは、コマンドをForceCommand /root/ssh-wrapperin などのように指定することで実行できます/etc/ssh/sshd_config(スクリプトの場所や名前は関係ありません。すべてのユーザーが実行できることと、sshd構成ファイルがそれを指していることを確認してください)。また、再起動/再ロードする必要がありsshdます。元のコマンドは、にアクセスすることが強制コマンドとして$SSH_ORIGINAL_COMMAND

このスクリプトを一緒にハッキングしただけです。

#! /bin/sh

# add logger options when needed
log="logger -t ssh-wrapper"

# find IP address
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

$log $USER login from $ip
espeak "$USER just logged in from $ip" > /dev/null 2>&1

$log command: ${SSH_ORIGINAL_COMMAND:-shell}
${SSH_ORIGINAL_COMMAND:-shell}

$log $USER logout
espeak "$USER just logged out" > /dev/null 2>&1

これで、ログインまたはログアウトするたびに音声で通知され、ログエントリがsyslogに書き込まれます。また、コマンドをログに記録します。次のようなものを使用して、sshdの使用を「フォロー」できます。

tailf /var/log/syslog | grep ssh-wrapper

このスクリプトはほとんどテストされていないため、ご自身の責任で使用してください。 ;-)

PS:このスクリプトはログインしたユーザーとして実行されるため、機能を追加するように変更すると、必要なことをすべて実行できないことに注意してください...


こんにちは、ユーザーがsshクライアントでウィンドウを閉じたばかりの状況を検出する方法はありますか。あなたのスクリプトはこの状況をフックしません。
ドミトリーエスキン

必要がありますshell$ {SSH_ORIGINAL_COMMENT:-shell}で例えばシェルへの実際のパスに置き換えること。/ bin / bash?私がそれを実行しようとすると、シェルのようなコマンドがないと不平を言います。実際、$ SHELLとはどういう意味ですか?これにより、ユーザーが指定したシェルが実行されます。
イブラヒム

1

以前にログファイルでこの一致するイベントを見たことがあります(これにより、何でも一致する柔軟性が得られます)。このページのフォーマットは不十分ですが、始めるのに役立つ場合があります:https : //help.ubuntu.com/community/AudibleLogs#Play with esound


私はあなた/彼らのespeak代わりにesound
JanC

0

ServerFaultの同じ質問からクロスポストされた回答)

必要な処理を実行するスクリプトを作成し、それをそのまま使用する/etc/profile/etc/bash.bashrc、必要に応じて使用します。これらのファイルへの変更は、すべてのユーザーに適用されます。ただし、このアプローチを使用してログアウトを通知する方法についてはわかりません。

あるいは、これを行う別の方法は、/var/log/auth新しい(および閉じる)sshセッションを監視する単純なデーモンを使用することです。そうすれば、ログインとログアウトの両方で通知を送信できます。


0

sshrcを使用できます(man sshd、sshrcを検索)

sshは/ etc / ssh / sshrcを実行します(存在する場合)。そこから1つのスクリプトを実行(または複数のスクリプトを呼び出す)できます

あなたは次のように、任意のbashの変数を呼び出すことができます$USERかを経由してIPを取得します

read -d " " ip <<< $SSH_CONNECTION

スクリプトを作成して、必要なものをテストまたはログに記録できます。

ログアウトスクリプト...まあ、それは私が探しているものです!:D


0

PAMが最良の選択肢だと思います。システム全体であり、ユーザーの設定ファイルで上書きすることはできません。

次の手順を実行できます。彼らはUbuntu 14.04.4 LTSで私のために働いた。

実行:

$ sudo pico /opt/custom/bin/info-session.sh

その空のファイルを編集して、次の行を追加します。

#!/bin/sh

[ "$PAM_TYPE" = "open_session" ] || exit 0

INFO=$(date +"%Y/%m/%d %T $PAM_USER ($PAM_RHOST) $PAM_SERVICE $PAM_TTY") # You can customize message.

echo "PAM access: $INFO" | write user > /dev/null 2>&1 # See Note 1.

exit 0

その後、スクリプトに実行権限を付与します。

$ sudo chmod ugo+x /opt/custom/bin/info-session.sh

次に、実行します:

$ sudo pico /etc/pam.d/common-session

ファイルの最後に次の行を追加します。

# Modified by user:
session optional pam_exec.so /opt/custom/bin/info-session.sh

サービスを再起動する必要はありません。このスクリプトは、ユーザーがSSHではなくターミナルからログインしたときにも実行されることに注意してください。

注1:パイプespeakまたは必要に応じた他のプロセス(電子メール、プッシュ通知など)にパイプできます。を使用writeしてユーザーがログインしている場合、ユーザーは端末に出力メッセージを直接表示します。

参照:
https : //blog.stalkr.net/2010/11/login-notifications-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on -user-login /

関連:
sshログインが成功したときに電子メールアラートを設定するにはどうすればよいですか?
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
/server//questions / 395393 / email-notification-about-each-ssh-connection-to-linux-server

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