在 SSH 登录和/或注销时运行(系统)脚本

在 SSH 登录和/或注销时运行(系统)脚本

我希望我的 OpenSSH 服务器在用户使用 SSH 登录时启动一个脚本,最好传递主机名或 IP 以及用户名。此外,我希望它在会话终止时运行一个脚本(传递用户名)。这些脚本不应在用户会话中运行,而应在系统范围内运行。

其想法是在登录和注销时发出音频警告,例如使用espeak,并在外部显示器上显示信息。

我看到有一个pam-scripts包,但我不确定它是否能满足我的要求,也不确定如何使用它。

答案1

您可以强制 SSH 用户执行命令,而不是他们请求的命令(如果他们没有给出特定命令,则强制执行他们的 shell)。这可以通过使用类似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:请记住,此脚本是以登录用户的身份运行的,因此如果您更改它以添加更多功能,则无法完成您想做的一切......

答案2

我之前在日志文件中看到过这种匹配事件(这可以让您灵活地匹配任何内容)。此页面格式不佳,但可能有助于您入门: https://help.ubuntu.com/community/AudibleLogs#Play使用 esound

答案3

您可以使用 sshrc(man sshd,搜索 sshrc)

如果 /etc/ssh/sshrc 存在,ssh 将执行它,然后您可以从那里运行一个脚本(或调用多个脚本)

你可以调用任何 bash 变量,例如$USER通过以下方式获取 IP

read -d " " ip <<< $SSH_CONNECTION

您可以编写脚本来测试或记录您想要的任何内容。

注销脚本......嗯,这就是我正在寻找的!:D

答案4

我认为聚丙烯酰胺是最佳选择。它是系统范围的,不能被用户的配置文件覆盖。

您可以按照以下步骤操作。它们在 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 登录成功时的电子邮件提醒?
https://serverfault.com/questions/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
https://serverfault.com/questions/395393/email-notification-about-each-ssh-connection-to-linux-server

相关内容