#!/bin/sh
if [ "$(id -u)" -ne 0 ]; then
echo 'This script must be run by root' >&2
exit 1
fi
cat <<HEADER
Host: $(hostname)
Time at start: $(date)
Running cache maintenance...
HEADER
swapoff -a && swapon -a
echo 1 >/proc/sys/vm/drop_caches
cat <<FOOTER
Cache maintenance done.
Time at end: $(date)
FOOTER
Пользователь root имеет UID 0 (независимо от имени учетной записи «root» ). Если эффективный UID, возвращаемый id -u
, не равен нулю, пользователь не выполняет сценарий с привилегиями root. Используйте id -ru
для проверки реального ID (UID пользователя , вызывающего скрипт ).
Не используйте $EUID
в скрипте, так как он может быть изменен непривилегированным пользователем:
$ bash -c 'echo $EUID'
1000
$ EUID=0 bash -c 'echo $EUID'
0
Если это сделает пользователь, это, очевидно, не приведет к повышению привилегий, но может привести к тому, что команды в сценарии не смогут выполнять то, что они должны делать, и файлы будут созданы с неверным владельцем и т. д.
Вы можете использовать parset
?
parset "`perl -nE '/[^=]+/ && print "$&,"'.env`" echo ::: "`perl -pe 's/[^=]+=//'.env`"
Он успешно обрабатывает ввод, например:
vv=* ; & " echo this is a value - not a command