Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 当用户从特定主机通过SSH登录时执行操作_Linux_Bash_Ssh_Profile - Fatal编程技术网

Linux 当用户从特定主机通过SSH登录时执行操作

Linux 当用户从特定主机通过SSH登录时执行操作,linux,bash,ssh,profile,Linux,Bash,Ssh,Profile,我有一个问题困扰着我,我想知道是否有人试图实现以下目标: 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) 假设这是我在Linux环境中的“last”命令的结果: root pts/1 192.168.1.10 Wed F

我有一个问题困扰着我,我想知道是否有人试图实现以下目标:

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)      
假设这是我在Linux环境中的“last”命令的结果:

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)   
如果“root”用户已从192.168.1.10登录,我如何设置特定操作(例如修改MOTD或发送电子邮件)。有没有办法获取这些信息

这个问题的第二部分是如何使上述检查更加可靠-即,如果我有以下内容:

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

欢迎提出任何建议


提前感谢。

一种方法是定期运行一个简单的脚本:

#!/bin/bash
users=$(last | sed -ne '/192\.168\.1\.10/ s/\([^ ]*\).*/\1/p')
for user in $users; do
    sendmail "$user" < email.txt
done
#/bin/bash
用户=$(最后一次| sed-ne'/192\.168\.1\.10/s/\([^]*\)./\1/p')
对于用户,单位为$users;做
sendmail“$user”
这将把最后一个命令导入sed,以提取用户列表并将其保存到变量
$users
中。sed命令使用
-n
标志,因此它只打印我们告诉它的内容。首先,我们选择包含指定IP的行,带有
/192\.168\.1\.10/
的“地址”。在这些行中,我们尝试提取空格前的字符,如果成功,则打印结果

然后,我们可以循环使用
$users
变量并相应地执行操作


一种反复调用的方法是通过cron,一种更简单的方法是在true时执行
;do./my_script.bash;睡眠60;完成

您可以向
/etc/profile
或等效文件添加一些内容,这些内容取决于
$SSH\u CLIENT

的值。看起来您正在使用
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

这些会话都不是活动的,而是历史记录的。

有一个特殊文件
/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
#/bin/bash
邮寄=user@domain.tld
受监视的用户=根用户
受监控的ip=x.x.x.x
主机名=$(主机名)
#添加欢迎信息:
printf>&2“\n帮助$hostname$USER\n”

阅读-d“ip谢谢您的回复。最终我找到了一个暂时可行的解决方案,但它确实有一个缺陷,我会在一分钟内指出

我已将以下内容添加到我的/etc/bashrc文件(或/etc/bash.bashrc,无论您使用的是什么环境):

我之前提到的缺陷实际上可能不是缺陷。如果您已经通过SSH连接到系统中,并且希望通过SSH连接到位于同一IP上的主机,请说
SSHroot@your-主持人
我是谁
然后会打印“你的主持人”,但我认为这是应该的方式

不用说,可以修改上面的
sed
语句,以便您也可以捕获用户名,并且可以扩展
if/else
语句以满足您的需要


再次感谢您的回复。

在ubuntu中,我添加了一个脚本

/etc/profile.d
当有人(用户ssh)登录时,它会向我的邮件发送一封电子邮件

#/etc/profile.d/run_on_loggin.sh
echo $(who i am) | mail -s 'SSH Login Notification' mymail@hotmail.com
我想创建一个php文件与smtp,发送电子邮件与我的邮件给我。。。 有时hotmail保存在垃圾邮件中

如果我有php文件,我会像

如果我想将var传递到文件php,请像

请原谅我的英语:3


注意:我认为此命令由用户运行,如果用户没有使用某些命令或发送电子邮件的权限,请小心。

Re cron vs while,而不是使用inotifywait来检测/var/log/wtmp中的更改。谢谢Janito。我想一定有更“互动”的东西。我的想法是,一旦有人ssh-s进入服务器,如果lastlog被更新为一个值,那么同样的信息可以被捕获,然后放入/etc/bash.bashrc文件中,以便在登录时调用它。您测试过我的
sshrc
文件吗?=)嗨,斯普特尼克。我们将到达第2级:)您知道如何排除记录来自cronjobs/代码片段的ssh命令的方法吗。我只对用户从控制台登录感兴趣。谢谢。把这个脚本放在一个文件中,然后把脚本的完整路径放在
/etc/ssh/sshrc
中,因为sshrc文件不处理bash测试。相应地进行了后期编辑。我遇到了与@Sergey相同的问题。此外,它似乎不喜欢
[[
。我在脚本中尝试了
echo$SHELL
,以确认它是bash.FWIW
[
有效。哦,
dig
没有安装。因为正如我前面所说,您必须将此脚本放在文件中,而不是直接放在
sshrc
中。
sshrc
必须包含可执行脚本的完整路径。此脚本适用于所有用户,当他们登录时?当然,测试它,您将看到