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


12

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

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

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

Answers:


10

您可以将一条命令强加给您的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:请记住,此脚本是以登录用户的身份运行的,因此,如果您对其进行更改以添加更多功能,则无法做任何事情...


嗨,有什么方法可以检测到用户刚刚使用ssh client关闭窗口时的情况。您的脚本无法解决这种情况。。谢谢。
德米特里·埃斯金

应该将shell$ {SSH_ORIGINAL_COMMENT:-shell}中的内容替换为外壳的实际路径,例如。/ bin / bash?当我尝试运行该命令时,它抱怨说没有像shell这样的命令。实际上,我想也许您的意思是$ SHELL?那应该运行用户指定的shell。
易卜拉欣

1

我之前已经在日志文件中看到过此匹配事件(这将使您可以灵活地匹配任何内容)。此页面格式不正确,但可能会帮助您入门:https : //help.ubuntu.com/community/AudibleLogs#Play with esound


我认为您/他们的意思espeak不是esound
2010年1

0

(从ServerFault上的同一问题交叉发布的答案)

只要写一个脚本做任何你想要的,然后把它贴在/etc/profile或可能/etc/bash.bashrc根据您的需要。对这些文件的更改将适用于所有用户。不过,我不确定您将如何使用这种方法在登出时进行通知。

另外,执行此操作的另一种方法是使用简单的守护程序监视/var/log/auth新的(和关闭的)ssh会话。这样,它将能够在登录和注销时发送通知。


0

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

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

您可以调用任何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 -用户登录/

相关:
ssh登录成功后,如何设置电子邮件警报?
通过/server//questions
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed- / 395393 /电子邮件通知-关于每个ssh-连接到Linux服务器的信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.