Во-первых, вам не следует анализировать вывод ls
и его вариантов. Вы можете сделать это, используяstat
:
$ stat -c%U-%G./*
tomasz-tomasz
tomasz-tomasz
tomasz-tomasz
Как видите, результатом является надежный список из двух соединенных слов, с которым вы можете работать, чтобы получить желаемый результат. Поместите его в петлю, и все готово:
PASS=true
for i in $(stat -c%U-%G./*); do
if ! [[ "$i" == root-root ]]; then
PASS=false; break
fi
done
if "$PASS"; then
echo Pass
else
echo Fail
fi
Значение i
должно быть равно root-root
, чтобы цикл дошел до своего конца с неизмененным переключателем.
Замените ./*
на the_dir/*
, чтобы проверить другое местоположение.
Разделитель -
необходим, потому что, как заметил Grump в комментариях, Сравнение строк может завершиться ошибкой, если файл принадлежит 'roo' и находится в группе 'troot', поэтому разделитель все равно будет быть хорошей вещью.
Ознакомьтесь с этим:Почему *не *parse `ls`(и что делать вместо )?
Я предполагаю, что почтовый инструмент ожидает \r\n
. Это также окончание строки, используемое в продуктах Microsoft. (они (или, может быть, авторы CP/M )не знали, как преобразовывать его при отправке на принтер, поэтому в качестве обходного пути каждый файл заканчивался этой строкой. msmtp
могут иметь свои причины. ).
Поэтому попробуйте передать его через unix2dos
.
т.е.
echo -e "This is a test. $(tail -5 /var/log/syslog)" | unix2dos | msmtp @domain
Кроме того, если вы не собираетесь использовать эхо для интерпретации журнала. я бы сделал
{
echo -n "This is a test. "
tail -5 /var/log/syslog
} |
unix2dos |
msmtp
Это очень просто. Входными данными для msmtp
должно быть правильно отформатированное почтовое сообщение с заголовками и телом. В конце концов, это еще одна капля -вместо /usr/{bin,lib}/sendmail
. Вы не отделили заголовки от тела или вообще не создали никаких заголовков. Строки вашего системного журнала обрабатываются как (какие-то очень странные заголовки ).
заголовки. новая линия. тело. Сгенерируйте это.