3

У меня есть скрипт bash, который использует sudo несколько раз. В этом есть пара странных моментов.

  1. Он запрашивает мой пароль через несколько секунд после того, как я уже ввел его для предыдущей команды.
  2. Второй раз, когда я ввожу свой пароль, он отображается на дисплее.

Вот соответствующие биты сценария.

sudo service apache2 stop
drush sql-dump --root="$SITE_DIR" --structure-tables-key=svn --ordered-dump | grep -iv 'dump completed on' | sudo tee "$DB_DIR/${SITE_NAME}.sql" > /dev/null
sudo svn diff "$DB_DIR" | less
sudo svn commit -m "$MESSAGE" "$DB_DIR"
sudo service apache2 start

Первый пароль для остановки Apache, и он работает как положено. Как уже упоминалось, sudo tee не «вспоминает», что у меня есть повышенные привилегии, снова запрашивает пароль и выводит его на экран. Учитывая , что tee все о вторя экран, я играл немного с простыми скриптами , которые имеют | sudo tee , и все они работают как положено.

Изменить: Я посмотрел на саму команду drush , и это bash-файл, который вызывает PHP с использованием exec . Похоже, что у него есть потенциал - есть идеи? Вот линия от drush .

exec php $SCRIPT_PATH --php=`which php` "$@"

Edit2: искал что-то связанное со сценариями Ruby и наткнулся на этот пост о повышенных привилегиях в сценариях из serverfault.

4 ответа4

8

Могу ли я предложить другое решение? Прекратите использовать sudo в скриптах bash, вместо этого запустите весь скрипт с повышенными правами.

Вы можете легко проверить, запущен ли скрипт от имени пользователя root или нет:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "$0 must be run as root"
    exit 1
fi

Взято из этого ТАКОГО вопроса.

0

Можете ли вы перепроверить свою версию sudo ?
Я вижу это в текущем руководстве sudo,

-A

Обычно, если sudo требует пароль, он будет читать его с текущего терминала. Если указана опция -A (askpass), запускается (возможно, графическая) вспомогательная программа для считывания пароля пользователя и вывода его на стандартный вывод. Если установлена переменная среды SUDO_ASKPASS, она указывает путь к вспомогательной программе. В противном случае используется значение, заданное параметром askpass в sudoers (5).

а также,

SUDO_ASKPASS

Указывает путь к вспомогательной программе, используемой для чтения пароля, если нет доступных терминалов или если указана опция -A.

Не могу вспомнить, прочитав или использовав это раньше ...

0

Вы также всегда можете посмотреть что-то простое, например, создать fifo или «pipe» для вывода, который вы хотите прочитать.

`mkfifo -m 600 /path/to/fifo` 

man mkfifo для получения дополнительной информации. Ваш код теперь будет читать что-то вроде:

sudo service apache2 stop 
#this will be visible and you can type in your password
stty -echo
# this will now remove echoing of characters to the screen
drush sql-dump --root="$SITE_DIR" --structure-tables-key=svn --ordered-dump | grep -iv 'dump completed on' | sudo tee "$DB_DIR/${SITE_NAME}.sql" > /dev/null
# as you are again looking for visible output, i would use the fifo here
sudo svn diff "$DB_DIR" \> /path/to/fifo &
sleep 4 # or longer
tail /path/to/fifo
sudo svn commit -m "$MESSAGE" "$DB_DIR"
sudo service apache2 start
stty echo
0

Из man 8 sudo примеров:

Составить список использования каталогов в разделе /home. Обратите внимание, что это запускает команды в под-оболочке, чтобы заставить работать перенаправление компакт-дисков и файлов.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

И я не знаю, какие "тесты" вы провели с тройником, но простой случай:

$ sudo id | sudo tee /tmp/junk

Запрашивает два пароля одновременно, а затем они оба борются за входную очередь, поэтому ни один из них не принимает пароль (и они испортили дисциплину stty line, чтобы набранные символы отображались).

Обновление: О, вы хотели знать, почему sudo не относится к конвейеру? Потому что оболочка должна отключать подпроцессы конвейера, каждый из которых наследует контекст родительской оболочки. Что касается оболочки, sudo - это просто команда, и она запускает свои аргументы в контексте повышенных привилегий, которые не "текут" по каналу. В качестве набора команд конвейер можно прочитать как

drush sql-dump > pipe ;  ( grep < pipe  ;  ( sudo tee file < pipe ) )

которая является более точной моделью того, что происходит.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .