Проблема, которую я имею, состоит в том, что действие, которое я ищу, состоит в том, чтобы sendemail отправил мне электронное письмо, которое содержит обоих w
вывод от пользователя SSH и вывод от выполнения lsof -u
на $SSH_USER для наблюдения, какие открытые файлы они имеют.
Вот сценарий:
#!/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 "xxx.notify@gmail.com" -u "someone has logged-in via ssh " -t "my.email@gmail.com" -s "smtp.gmail.com:587" -m "$SSH_USERS \n lsof -u "$SSH_USER"" -o tls=yes -xu "xxx.notify@gmail.com" -xp 'my_notify.email.pw'
else
echo "nobody logged-in via ssh"
fi
Обратите внимание, что-m опция состоит в том, куда тело электронной почты идет, и я заполняю его двумя переменными. Каждый - вывод w
и другой ouput 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
таким образом, это разворачивает переменную правильно - но это просто echos это, вместо того, чтобы отобразить вывод команды.
Должно быть что-то, в чем я выполняю неправильно -m "$SSH_USERS \n lsof -u "$SSH_USER""
часть сценария - какова могла быть причина, что это только отправляет мне вывод от первой половины сообщения? Как получить это lsof -u $SSH_USER
чтобы на самом деле работать и обеспечить вывод, а не просто повторяют себя?
Необходимо использовать замену команды Bash таким же образом, поскольку Вы сделали ранее в сценарии.
Изменение:
-m "$SSH_USERS \n lsof -u "$SSH_USER""
кому:
-m "$SSH_USERS \n $(lsof -u "$SSH_USER")"
Это будет на самом деле работать lsof
управляйте, чтобы Вы искали.
Также стоит отметить, что двойные кавычки не вкладывают, они действуют как переключатель, som в исходной версии, Вы заключаете в кавычки "$SSH_USERS \n lsof -u "
в то время как $SSH_USER закрывается кавычки, затем ""
в конце ничего не делает.