我遇到的问题是,我正在寻找的操作是让 sendemail 向我发送一封电子邮件,其中包含w
来自 ssh 用户的输出以及对 $SSH_USER 执行的输出,lsof -u
以查看他们打开了哪些文件。
脚本如下:
#!/usr/bin/env bash
# This line looks for the string "pts/" in the output of `w`, then strips out the owner information and passes it to SSH_USER
SSH_USER="$(w | grep "pts/" | cut -d" " -f1 | awk 'NR < 2')";
SSH_USERS="$(w)"
if w | grep -q "pts/"; then
echo "someone logged-in via ssh" && sendemail -f "[email protected]" -u "someone has logged-in via ssh " -t "[email protected]" -s "smtp.gmail.com:587" -m "$SSH_USERS \n lsof -u "$SSH_USER"" -o tls=yes -xu "[email protected]" -xp 'my_notify.email.pw'
else
echo "nobody logged-in via ssh"
fi
请注意,-m 选项是电子邮件正文的位置,我用两个变量填充它。一个是 的输出,w
另一个是 的输出lsof -u $SSH_USER
,在本例中应该扩展为lsof -u robert
。
以下是输出w
:
23:46:23 up 3:41, 3 users, load average: 0.40, 0.44, 0.50
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
robert :0 :0 20:07 ?xdm? 6:10 0.01s /usr/lib/gdm3/gdm-x-session --run-script env GNOME_SHELL_SESSION_MODE=ubuntu gnome-se
robert pts/1 10.0.0.3 22:56 50:04 0.04s 0.04s -bash
robert pts/4 10.0.0.3 23:10 36:16 0.04s 0.04s -bash
这是我收到的电子邮件:
23:40:31 up 3:35, 3 users, load average: 0.60, 0.60, 0.56
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
robert :0 :0 20:07 ?xdm? 6:05 0.01s /usr/lib/gdm3/gdm-x-session --run-script env GNOME_SHELL_SESSION_MODE=ubuntu gnome-session --session=ubuntu
robert pts/1 10.0.0.3 22:56 44:12 0.04s 0.04s -bash
robert pts/4 10.0.0.3 23:10 30:24 0.04s 0.04s -bash
lsof -u robert
您可以在电子邮件的底部看到它说它lsof -u robert
正确扩展了变量 - 但它只是回显它,而不是显示命令的输出。
我在脚本的这一部分肯定做错了什么-m "$SSH_USERS \n lsof -u "$SSH_USER""
——它只向我发送消息前半部分的输出,这是什么原因?如何让它lsof -u $SSH_USER
真正运行并提供输出,而不仅仅是回显自身?
答案1
您需要以与之前在脚本中相同的方式使用 Bash 命令替换。
改变:
-m "$SSH_USERS \n lsof -u "$SSH_USER""
到
-m "$SSH_USERS \n $(lsof -u "$SSH_USER")"
这实际上将运行lsof
您正在寻找的命令。
还值得注意的是,双引号不能嵌套,它们的作用类似于切换,在原始版本中,您"$SSH_USERS \n lsof -u "
在 $SSH_USER 未加引号时引用,则""
最后的不会执行任何操作。