Как вводить пароль только один раз в сценарии bash, требующем sudo

Данные

Я хочу, чтобы пользователи-пользователи на этом компьютере монтировали свои собственные cifs-файлы. Файл sudoers уже содержит команду /bin/mount -t cifs //*/* /media/* -o username=* для всех операторов. Я хочу, чтобы пользователи монтировали cifs share через скрипт, вводя пароль только один раз, а не дважды. Пароль sudo и пароль cifs идентичны.

Что у меня уже есть

Этот скрипт работает:

#!/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, но я пытаюсь ужесточить безопасность, не отказываясь от удобства ...

1
задан 6 March 2016 в 15:09

3 ответа

Вместо этого вы должны сделать запрос на использование 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

Не пытайтесь захватить пароль своих пользователей.

22
ответ дан 23 May 2018 в 14:54
  • 1
    Возможно, я что-то упустил, но можете ли вы объяснить, как это уменьшает количество запросов пароля от двух до одного? В противном случае я не вижу, как это отвечает на вопрос. – Oliphaunt 21 December 2015 в 15:36
  • 2
    @Oliphaunt Я не вижу двух подсказок пароля, можете ли вы это объяснить? Кроме того, этот ответ - это не то, что хочет OP, а то, что ему нужно. Это чистое и правильное решение, когда вам нужно запускать команды как root, и как это делают другие утилиты (проверьте, не root ли root) – Braiam 21 December 2015 в 18:08
  • 3
    Проблема OP (как я понимаю) заключается в том, что пользователю предлагается ввести пароль sudo, а затем (после успешной аутентификации) снова mount. В их случае использования эти пароли идентичны, поэтому я могу понять, почему OP хотел бы, чтобы пользователь только вводил этот пароль один раз. Я не считаю, что ваше решение помогает в этом. Я согласен с тем, что не следует записывать пароли. – Oliphaunt 21 December 2015 в 18:19
  • 4
    Спасибо, но я, возможно, немного упростил вопрос: это уже скрипт, уже содержит этот тест (кроме 1>&2), находится в автозапуске, и он использовался как один общий ресурс cifs, но теперь это три, , так что действительно нужен один пароль. (Он уже содержит этот тест, если кто-то другой, а не член группы операторов, пытается его запустить) – Fabby 21 December 2015 в 21:40
  • 5
    @Fabby Я все еще думаю, что вы неправильно подходите к проблеме. Для этих случаев есть вспомогательный ключ к "запомнить" пароль для файла CIFS / SMB безопасно (например, редактирование ~/.smbcredentials) и даже без необходимости использования sudo (если вы используете gvfs, umount или polkit). – Braiam 21 December 2015 в 22:10

Не требуйте пароля 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=*
3
ответ дан 23 May 2018 в 14:54
  • 1
    @Fabby Извините, но что в этом такого опасного? Также я могу обнаружить намек на сарказм, не уверен. – Oliphaunt 21 December 2015 в 00:50
  • 2
    ну, даже если sudo не требует пароля, mount может по-прежнему требовать пароль. Файл / etc / sudoers можно использовать, чтобы сделать sudo не требующим пароля. Это не повлияет на то, будет ли mount запрашивать пароль. Если человек не смог подключиться, тогда sudo просто закончит выполнение команды, которая не удалась, что, вероятно, не проблема. – TOOGAM 21 December 2015 в 12:49
  • 3
    @TOOGAM Это было мое намерение. Один пароль вместо двух. – Oliphaunt 21 December 2015 в 13:09
  • 4
    Я намерен сохранить один «оператор». группы в файле sudoers, поэтому, если оператор пытается установить свои собственные вещи, они все равно должны ввести пароль, но для установки «стандартного» операторы монтируют, им нужно только ввести пароль один раз вместо 5 раз ... Но ваше решение может работать для других, поэтому рекомендуется ... (и исходные комментарии удалены) – Fabby 21 December 2015 в 21:07

Общее решение этих проблем состоит в том, чтобы поставить следующую преамбулу в верхней части вашего 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 запомнить учетные данные пользователя на ограниченное количество минут (и может быть дробным).

0
ответ дан 23 May 2018 в 14:54
  • 1
    Я упростил сценарий, чтобы получить легкий ответ: скрипт уже содержит: #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 Дело в том, что он также содержит несколько монтирует все с одним и тем же паролем (снова: удалено), но в любом случае спасибо .. , – Fabby 26 December 2015 в 12:18
  • 2
    Дело в том, что вышеприведенное решение требует только одного ввода пароля (для sudo). Он не должен требовать другого. Кроме того, он является общим (и более элегантным, чем предоставление ошибки и необходимость повторной команды с sudo) для всех подобных проблем, даже если им требуется несколько (более двух) привилегированных команд. – arielf 26 December 2015 в 13:19
  • 3
    Он должен , но он не ! ; -) Это потому, что для каждого совместного доступа cifs требуется пароль. (поскольку он может отличаться от пароля Ubuntu, но в этом случае не так, как операторы синхронизируют свои пароли Windows и Ubuntu) – Fabby 26 December 2015 в 13:23

Другие вопросы по тегам:

Похожие вопросы: