sudoers
файл уже содержит /bin/mount -t cifs //*/* /media/* -o username=*
команда для всех операторов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, жемчуг, C, Не Идет... пожалуйста?
Примечание 2: Я знаю, что могу просто удалить пароль через sudoers
файл, но я пытаюсь сжать безопасность, не ослабить его, не бросая удобство...
следующий сценарий:
#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"
просто работы и:
Необходимо вместо этого заставить пользователя сделать вызов использования sudo как sudo script
. просто проверьте, запускается ли скрипт как корень, если не просят его
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root, use sudo "$0" instead" 1>&2
exit 1
fi
Не пытайтесь получить пароль своих пользователей.
Потребуйте нет sudo
пароль для выполнения этой команды; подсказка пароля для mount
остается.
В sudoers
, включайте что-то как
ALL ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
После включая это, sudo
больше не будет просить пароль для этой определенной команды; пользователь все еще должен предоставить пароль mount
команда.
Примечание: Я принял управление дословно от того, что Вы включали в вопрос; я не проверял, позволят ли его подстановочные знаки, чтобы пользователи сделали что-то противное. Читайте 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 ...
Очевидно, это имеет оборотную сторону в этом, если некоторые команды в сценарии не требуют sudo
для выполнения существует ненужное повышение полномочий здесь.
Так или иначе мысль я совместно использовал бы эту небольшую подсказку. Самая хорошая вещь об этом, то, что, если Вы уже - эффективный-uid корень (например, если Вы уже назвали его под sudo) это корректно делает правильную вещь. Также предоставление ошибки и принуждение Вас перепечатать/повторно выполнить (с sudo) являются менее дружественными.
Можно также хотеть проверить timestamp_timeout
переменная в man 5 sudoers
который говорит sudo
помнить удостоверения пользователя за ограниченное количество минут (и может быть дробным).