Я пишу сценарий оболочки, в котором для большинства команд не требуются привилегии root. Скрипт должен запускаться администратором. Но я хотел бы иметь возможность «su» для обычной учетной записи пользователя для тех частей скриптов, которые не требуют привилегий root. Это минимизирует количество операций, выполняемых с привилегиями root, и повысит безопасность.
Есть ли для этого команда linux?
Я знаю, что можно использовать su для любой учетной записи пользователя, но я не хочу полагаться на гипотезу о том, что на машине существует конкретное имя пользователя.
Я подумал о создании временной учетной записи на время сценария и удалении ее в конце сценария. Но если я не установлю пароль для этой учетной записи, не сможет ли злоумышленник использовать его в течение короткого времени существования учетной записи? Я не могу настроить пользовательскую оболочку на / sbin / nologin, потому что, по-видимому, это предотвращает выполнение команд в сценарии оболочки "подавать в суд" на счет.
Спасибо за вашу помощь.
Я бы лично изменил вашу стратегию и запустил скрипт от имени непривилегированного пользователя с sudo, используемым для запуска команд, требующих привилегий root. Есть ли какая-то конкретная причина, по которой вам нужно запускать скрипт от имени пользователя root?
Однако, чтобы ответить на ваш вопрос, вы можете использовать флаг -c для запуска определенной команды от имени пользователя:
su someuser -c "touch /tmp/file"
Ссылка: http://linux.die.net/man/1/su
Я не хочу полагаться на гипотезу о том, что на машине существует определенное имя пользователя.
У суперпользователя есть свои преимущества ... :-)
scriptuser_created=no
scriptuser=myuser
if ! id "$scriptuser" &>/dev/null
adduser --system "$scriptuser"
scriptuser_created=yes
fi
sudo -u "$scriptuser" command1
sudo -u "$scriptuser" command2
sudo -u "$scriptuser" command3
if [ yes = "$scriptuser_created" ]; then
userdel "$scriptuser"
fi
#! /bin/bash
# (GPL3+) Alberto Salvia Novella (es20490446e)
execute () {
function="${1}"
command="${2}"
error=$(eval "${command}" 2>&1 >"/dev/null")
if [ ${?} -ne 0 ]; then
echo "${function}: $error"
exit 1
fi
}
executeAsNonAdmin () {
function="${1}"
command="${2}"
eval setPasswordAsker="SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass"
run="runuser ${SUDO_USER} --session-command=\"${setPasswordAsker}\" --command=\"${command}\""
execute "${function}" "${run}"
}
executeAsNonAdmin "" "${@}"
Su обозначает замещающего пользователя. Вы можете использовать su для перехода к другому пользователю. Итак, если вы суперпользователь и хотите запустить что-то от имени другого пользователя, просто введите имя пользователя и выполните команду.
Традиционное решение такой проблемы заключается в существовании постоянной учетной записи пользователя с точно такими же уровнями доступа и разрешениями, которые требуются данной программе. Сетевые службы (например, apache) часто запускаются как собственный пользователь, с привилегиями, отличными от привилегий обычного интерактивного пользователя, и значительно меньшими, чем у root.
Если root запускает сценарий в первую очередь, им не нужно будет предоставлять пароль для su другому пользователю, даже если у этого пользователя есть пароль.
Вставьте это в начало вашего сценария оболочки.
# please run as foo user
if [[ $EUID -ne 1234 ]]; then
echo "This script must be run as foo"
exit 1
fi
Вы жестяная банка установите оболочку на nologin.
Добавьте привилегии sudo для пользователя foo, чтобы он мог выполнять оставшиеся операции, требуемые root, только с помощью тщательно продуманной конфигурации sudoer.