Этот скрипт работает:
#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
... но для этого требуется, чтобы пользователи дважды вводили один и тот же пароль!
Я хочу, чтобы пользователи-пользователи на этом компьютере монтировали свои собственные cifs-файлы Один раз для самого монтированияЭто также сработало бы:
#!/bin/bash
echo -n Password:
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
... , но для этого требуется, чтобы пользователи дважды вводили один и тот же пароль! (основная проблема безопасности)
* Как монтировать cifs share в bash¹, не помещая sh в файл sudoers и не создавая постоянный / временный файл. *
Примечание 1: нет python, perl, C, Go, ... please ? Примечание 2: Я знаю, что могу просто удалить пароль через файл sudoers, но я пытаюсь ужесточить безопасность, не отказываясь от удобства ...
Вместо этого вы должны сделать запрос на использование sudo как sudo script. просто проверьте, запускается ли скрипт как root, если не запрашивать его
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root, use sudo "$0" instead" 1>&2
exit 1
fi
Не пытайтесь захватить пароль своих пользователей.
Не требуйте пароля sudo для выполнения этой команды;
В sudoers включить что-то вроде
ALL ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
. После включения этого параметра sudo больше не будет запрашивать пароль для этого конкретная команда; пользователю по-прежнему необходимо предоставить пароль для команды mount.
Не требовать пароль sudo для выполнения этой команды; запрос пароля для mount остается. : Я принял команду дословно из того, что вы включили в вопрос; Я не проверял, позволят ли его подстановочные знаки пользователям делать что-то неприятное. Прочтите man-страницу sudoers для примеров гадостей. В частности, обратите внимание, что эта строка в sudoers позволяет пользователю добавлять любое количество -o переключателей или других аргументов в mount. Вы можете пересмотреть свой подход, например. добавив скрипт, такой как @Braiam, предлагает и позволяет запускать это через sudo без дополнительной аутентификации. Затем скрипт гарантирует, что пользователи могут запускать только определенную форму mount, которую вы хотите запустить.
Кроме того, вместо того, чтобы разрешать это для всех пользователей, вы также можете ограничить это членами определенного группы, например вы можете создать группу cifsmount, а затем
%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
Общее решение этих проблем состоит в том, чтобы поставить следующую преамбулу в верхней части вашего sudo, требующую скриптов:
#!/bin/bash
case $EUID in
0) : cool we are already root - fall through ;;
*) # not root, become root for the rest of this session
# (and ask for the sudo password only once)
sudo $0 "$@" ;;
esac
# now the present process is effective-UID (root)
# so there's no need to put sudo in front of commands
any more commands here will run as superuser ...
Очевидно, это имеет недостаток в том, что если некоторые команды в скрипте не выполняются, t требуется sudo для запуска, здесь есть ненужное возвышение привилегий.
В любом случае, подумал, что я поделюсь этим маленьким советом. Самое приятное в этом заключается в том, что если вы уже являетесь эффективным root-uid root (например, если вы уже его назвали в sudo), он изящно делает все правильно. Кроме того, вы получаете ошибку и заставляете повторить / повторить (с sudo) менее дружелюбно.
Вы также можете проверить переменную timestamp_timeout в man 5 sudoers, которая сообщает sudo запомнить учетные данные пользователя на ограниченное количество минут (и может быть дробным).