Запомните пароль sudo в шеллскрипте - PullRequest
0 голосов
/ 14 декабря 2011

Я хочу сделать сценарий для установки Wine на Mac, и я хочу, чтобы пользователь ввел свой пароль, чтобы впоследствии скрипт мог использовать его для автоматической установки, автоматически вводя парольпо командам "sudo".Вот что я получил на данный момент:

clear
echo Wine Installer v1.0
echo -------------------
echo      by Sydcul
sleep 4
clear
  echo "Please enter your OS X user password."
  echo "It is needed in some parts of the installation."
  read PASSWORD
  echo "Wine installation starting."
  echo "Please do not shut down your system."
  mkdir winetmp
  cd winetmp
  curl -O https://distfiles.macports.org/MacPorts/MacPorts-2.0.3.tar.bz2
  tar xjvf MacPorts-2.0.3.tar.bz2
  cd MacPorts-2.0.3
  echo $PASSWORD | ./configure && make && sudo make install
  echo $PASSWORD | sudo port -v selfupdate 
  echo $PASSWORD | sudo port -v install xorg
  echo $PASSWORD | sudo port -v install wine
  rm -rf ~/winetmp
  clear
  echo "Wine is successfully installed and ready for use!"

Но в определенный момент все равно просит пароль.Как я могу это исправить?

Ответы [ 4 ]

3 голосов
/ 14 декабря 2011

Честно говоря, я бы отбросил все эти вещи $PASSWORD и удалил бы sudo из всех ваших команд.Вы пишете сценарий установки, который должен запускаться с повышенными привилегиями.Попросите пользователей выполнить ваш сценарий с помощью sudo ./installwine.sh, а затем выполнить команды в сценарии без sudo.Все ваши port -v вещи будут наследовать повышенные привилегии.

Если вы хотите предложить вашему пользователю приятное сообщение об ошибке, если он забудет запустить скрипт с sudo (вместо того, чтобы просто сделать первый вызов)на port не удалось зашифровать), вы можете проверить, равен ли 0 эффективный идентификатор пользователя ($EUID), распечатать сообщение об ошибке и выйти в противном случае.Смотри https://askubuntu.com/questions/30148/how-can-i-determine-whether-a-shellscript-runs-as-root-or-not.

1 голос
/ 14 декабря 2011

Вы можете впервые запросить у пользователя пароль, а затем сохранить его в файле (и не забудьте зашифровать его).

В следующий раз, когда вам это понадобится, вы можете легко прочитать его из того же файла и сохранить в переменной, а затем использовать эту команду

echo $variablename | sudo -S command

0 голосов
/ 29 января 2012

Почему бы вам просто не использовать опцию настраиваемого приглашения для sudo и позволить ему запрашивать пароль, если он ему нужен?

Вы начинаете с проверки, являются ли они пользователем root или нет так:

SUDO=""
if [[ 0 == $(id -u) ]]
then
  SUDO="sudo "
fi
$SUDO command 1
$SUDO command arg arg arg

, а затем при желании объедините это с возможностью настройки приглашения sudo с помощью параметра -p.

then
  SUDO="sudo -p \"I need elevated access for this part. Please enter %u's password:\" "
fi

Вы по-прежнему получаете контроль над интерфейсом, но не запрашиваетедля пароля, если вам это не нужно.Например, некоторые люди могут настроить sudo для работы с nopassword.Другие могут запустить ваш установщик от имени пользователя root.Или, может быть, их пароль уже кэширован с помощью sudo.И т.д. Лучше всего позволить sudo управлять запросами, возможно, при необходимости используя программу askpass (см. Параметр -A).

0 голосов
/ 14 декабря 2011

На самом деле я думаю, что sudo не принимает пароль от стандартного ввода (вам нужно указать параметр -S, чтобы включить это).В качестве обходного пути вы можете выполнить sudo su для получения привилегий root для всех команд.

UPD: Я не рекомендую сохранять пароль в файл, поскольку это очень плохое решение с точки зрения безопасности.

UPD2: Вы забываете о XCode, если он не установлен, этот скрипт завершается ошибкой на этапе компиляции:)

...