尝试编写 bash 脚本,发送带有两个变量输出的电子邮件 ubuntu 18.04

尝试编写 bash 脚本,发送带有两个变量输出的电子邮件 ubuntu 18.04

我遇到的问题是,我正在寻找的操作是让 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 未加引号时引用,则""最后的不会执行任何操作。

相关内容