Данные
- Я хочу, чтобы пользователи-операторы на этой машине монтировали свои собственные ресурсы cifs.
sudoers
Файл уже содержит/bin/mount -t cifs //*/* /media/* -o username=*
команду для всех операторов- Я хочу, чтобы пользователи монтировали
cifs
общий ресурс через скрипт, набирая пароль только один раз, а не дважды. - Пароль sudo и пароль cifs идентичны.
Что у меня уже есть
Этот скрипт работает:
#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
... но это требует, чтобы пользователи вводили один и тот же пароль дважды!
- Один раз для
sudo
- Один раз для самой горы
Это также будет работать:
#!/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'
... но для этого нужно, чтобы все операторы могли это делатьsudo sh
(серьезная проблема безопасности)
Вопрос
Как смонтировать долю CIFS в Баш ¹ без ввода sh
в sudoers
файл и не создавая постоянный / временный файл ???
Примечание 1: нет Python, Perl, C, Go, ... пожалуйста?
Примечание 2: я знаю, что могу просто удалить пароль через sudoers
файл, но я пытаюсь повысить безопасность, а не ослабить его, не отказываясь от удобства ...
printf "%s\n" "$szPassword" "$szPassword" | sudo -S mount -t cifs / ...
?Ответы:
Вместо этого вы должны заставить пользователя использовать sudo as
sudo script
. просто проверьте, запускается ли скрипт от имени пользователя root, если не спросите егоНе пытайтесь захватить пароль ваших пользователей.
источник
sudo
а затем (после успешной аутентификации) сноваmount
. В их случае использования эти пароли идентичны, поэтому я понимаю, почему ОП хочет, чтобы пользователь вводил этот пароль только один раз. Я не верю, что ваше решение поможет с этим. Я согласен с тем, что не следует захватывать пароли.1>&2
), находится в автозапуске, и раньше это был только один ресурс cifs, но теперь это три, так что действительно один пароль нужно. (Он уже содержит этот тест на случай, если кто-то другой, не~/.smbcredentials
например, редактирование ) и даже без необходимости использования sudo (если вы используете gvfs, umount или polkit).Я тупой!
Следующий скрипт:
просто работает и:
источник
<<<
можно также использовать вместоprintf
, но лучшим подходом было быread
вообще отказаться от использования и просто использоватьsudo --stdin
все само. Нечто подобное$ printf "Type out your password\n" && sudo --stdin apt-get update
Пользователь все еще может ввести пароль sudo. и это не поместит его в список процессов. Но, конечно, существует бесконечное количество возможных других проблем безопасности, таких как клавиатурные шпионы, потенциальные уязвимостиsudo
, и бла, и бла, и бла в бесконечностьНе требовать
sudo
пароля для выполнения этой команды; запрос пароляmount
остается.В
sudoers
, включить что-то вродеПосле включения этого
sudo
больше не будет запрашивать пароль для этой конкретной команды; пользователь все еще должен предоставить пароль дляmount
команды.Примечание : я взял команду дословно из того, что вы включили в вопрос; Я не проверял, позволят ли его подстановочные знаки пользователям делать что-то неприятное. Прочитайте
sudoers
man-страницу для примеров злобности. В частности, обратите внимание, что эта строкаsudoers
позволяет пользователю добавлять любое количество-o
переключателей или других аргументовmount
. Возможно, вы захотите переосмыслить свой подход, например, добавив скрипт, такой как предлагает @Braiam, и разрешите его выполнениеsudo
без дополнительной аутентификации. Затем сценарий гарантирует, что пользователи могут запускать только ту форму,mount
которую вы хотите, чтобы они запускали.Кроме того, вместо того, чтобы разрешить это для всех пользователей, вы также можете ограничить это членами определенной группы, например, вы можете создать группу
cifsmount
и затем иметьисточник
Общее решение этих проблем - поместить следующую преамбулу в начало вашего sudo, требующего сценариев:
Очевидно, что это имеет недостаток в том, что если некоторые команды в скрипте не требуют
sudo
запуска, здесь есть ненужное повышение привилегий.Во всяком случае, думал, что поделюсь этим маленьким советом. Самое приятное в этом то, что если вы уже являетесь пользователем root с эффективной эффективностью (например, если вы уже называли его с помощью sudo), он корректно поступает правильно. Также выдает ошибку и заставляет вас повторно вводить / перезапускать (с помощью sudo) менее дружественно.
Вы можете также захотеть проверить
timestamp_timeout
переменную, вman 5 sudoers
которой указываетсяsudo
запоминать учетные данные пользователя в течение ограниченного количества минут (и может быть дробным).источник
#test if root: if not: bail out if [[ $EUID -ne 0 ]]; then echo "This script must be run as root, use sudo "$0" instead" 1>&2 exit 1 fi
Дело в том, что он также содержит несколько монтирований, все с одним и тем же паролем (снова: удален), но все равно спасибо ...