Я хочу запустить sudo su из сценария, но получить ошибку с svcuwa4 [duplicate]

Расширяя эту идею, попробуйте создать файлы .desktop для команд mimeopen -a и mimeopen -d. Это восстанавливает возможность открытия через пользовательскую команду в нужном контекстном меню, хотя вам нужно немного выкопать в меню, чтобы добраться до нее.

59
задан 5 October 2017 в 19:54

9 ответов

Редко бывает неплохо иметь sudo внутри скриптов. Вместо этого удалите sudo из сценария и запустите сам скрипт с помощью sudo:

sudo myscript.sh

Таким образом, все команды в скрипте будут запускаться с привилегиями root, и вам нужно будет только дать пароль один раз при запуске скрипта. Если вам нужна конкретная команда в скрипте, который будет запущен без привилегий sudo, вы можете запустить его как обычного пользователя (спасибо Lie Ryan):

sudo -u username command

Пространство не имеет значения, оно должно ничего не влияет, всегда существует пробел между командой и ее аргументами.

80
ответ дан 18 July 2018 в 05:39

На самом деле существует гораздо более простой способ сделать это.

Введите пароль sudo в качестве параметра при запуске скрипта, захватите его и эхо-повторите с каждой командой, которая будет запрашивать пароль sudo.

#!/bin/bash PW=$1 echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql ./command_wo_sudo.sh <param> echo $PW | ./other_command_requires_sudo.sh <param>

Вы можете добавить приглашение и захватить после того, как скрипт будет выведен следующим образом:

echo "enter the sudo password, please" read PW

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

Это также работает с запущенными командами / сценариями, для которых требуется продолжить да:

echo $PW | yes | ./install.sh

Эхо в ответ на приглашение, поэтому вы можете использовать все, что вам нужно, там, если вы используете другие сценарии, которые запрашивают прогресс, в последовательном порядке. Удостоверьтесь, что вы знаете этот порядок, хотя или могут произойти плохие вещи.

0
ответ дан 18 July 2018 в 05:39

Этот ответ похож на ответ тердона. Поскольку я также предлагаю запустить основной скрипт с sudo, чтобы вы могли запускать команды, не спрашивая у пользователя ни одного пароля.

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

Это пример скрипта как вы могли бы это достичь:

#!/bin/bash # ref: https://askubuntu.com/a/30157/8698 if ! [ $(id -u) = 0 ]; then echo "The script need to be run as root." >&2 exit 1 fi if [ $SUDO_USER ]; then real_user=$SUDO_USER else real_user=$(whoami) fi # Commands that you don't want run with root would be invoked # with: sudo -u $real_user # So they will be ran as the user who invoked the sudo command # Keep in mind, if the user is using a root shell (they're logged in as root), # then $real_user is actually root # sudo -u $real_user non-root-command # Commands that need to be ran with root would be invoked without sudo # root-command
4
ответ дан 18 July 2018 в 05:39

Вы можете изменить файл sudoers.

Запустить sudo visudo.

Добавить запись для вашего имени пользователя и скрипта, который вы хотите запустить, без запроса для пароля.

username ALL=(ALL) NOPASSWD: /path/to/script
29
ответ дан 18 July 2018 в 05:39

Редко бывает неплохо иметь sudo внутри скриптов. Вместо этого удалите sudo из сценария и запустите сам скрипт с помощью sudo:

sudo myscript.sh

Таким образом, все команды в скрипте будут запускаться с привилегиями root, и вам нужно будет только дать пароль один раз при запуске скрипта. Если вам нужна конкретная команда в скрипте, который будет запущен без привилегий sudo, вы можете запустить его как обычного пользователя (спасибо Lie Ryan):

sudo -u username command

Пространство не имеет значения, оно должно ничего не влияет, всегда существует пробел между командой и ее аргументами.

80
ответ дан 24 July 2018 в 18:23
  • 1
    в скрипте могут быть команды, которым не нужна привилегия root, вы можете временно удалить привилегии root для этих команд, используя sudo -u username – Lie Ryan 26 February 2014 в 04:01
  • 2
    Многие скрипты, которые я пишу, выполняют целую кучу взаимодействия с пользователем и / или проверку ошибок. Затем одна команда в конце - что-то вроде rsync - должна выполняться как root. Почему я хочу, чтобы все это выполнялось с повышением и оставалось открытым для многих строк кода, которые могут содержать серьезные ошибки или уязвимости с правами доступа root - особенно при отладке - когда требуется только один или несколько команд? – Joe 26 September 2015 в 07:28
  • 3
    @Joe справедливо. Изменена «никогда не хорошая идея». к "редко". – terdon♦ 29 September 2015 в 00:04
  • 4
    @Joe имеет действительно хороший момент здесь. Также, когда вы говорите, что не делают этого , было бы хорошо знать, почему это или, по крайней мере, в каком контексте я не должен этого делать, и почему – arainone 24 September 2016 в 13:50
  • 5
    @terdon Ты не слушаешь. Я знаю, что если вы запустите скрипт как root , он никогда не предложит вам sudo. Я сравниваю это с тем, что не запускает скрипт как root и вместо этого помещает в скрипт явные вызовы sudo, потому что повышение всего скрипта до корня может быть ужасной идеей, если есть только несколько узкие действия, которые нуждаются в корне. В этом контексте я отвечал конкретно на ваш комментарий: «Во многом потому, что это означает, что вы не можете запускать скрипт автоматически, так как вам нужно будет вводить пароль каждый раз, когда вас спросят». – BeeOnRope 10 August 2017 в 19:31

На самом деле существует гораздо более простой способ сделать это.

Введите пароль sudo в качестве параметра при запуске скрипта, захватите его и эхо-повторите с каждой командой, которая будет запрашивать пароль sudo.

#!/bin/bash PW=$1 echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql ./command_wo_sudo.sh <param> echo $PW | ./other_command_requires_sudo.sh <param>

Вы можете добавить приглашение и захватить после того, как скрипт будет выведен следующим образом:

echo "enter the sudo password, please" read PW

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

Это также работает с запущенными командами / сценариями, для которых требуется продолжить да:

echo $PW | yes | ./install.sh

Эхо в ответ на приглашение, поэтому вы можете использовать все, что вам нужно, там, если вы используете другие сценарии, которые запрашивают прогресс, в последовательном порядке. Удостоверьтесь, что вы знаете этот порядок, хотя или могут произойти плохие вещи.

0
ответ дан 24 July 2018 в 18:23

Этот ответ похож на ответ тердона. Поскольку я также предлагаю запустить основной скрипт с sudo, чтобы вы могли запускать команды, не спрашивая у пользователя ни одного пароля.

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

Это пример скрипта как вы могли бы это достичь:

#!/bin/bash # ref: https://askubuntu.com/a/30157/8698 if ! [ $(id -u) = 0 ]; then echo "The script need to be run as root." >&2 exit 1 fi if [ $SUDO_USER ]; then real_user=$SUDO_USER else real_user=$(whoami) fi # Commands that you don't want run with root would be invoked # with: sudo -u $real_user # So they will be ran as the user who invoked the sudo command # Keep in mind, if the user is using a root shell (they're logged in as root), # then $real_user is actually root # sudo -u $real_user non-root-command # Commands that need to be ran with root would be invoked without sudo # root-command
4
ответ дан 24 July 2018 в 18:23

Вы можете попытаться добавить пользователя, который запускает скрипт в файл sudoers:

#give permissions to the file sudo chmod 700 /etc/sudoers.d/useradm sudo visudo /etc/sudoers.d/useradm #add the following text, changing "user" but your desired user user ALL=(ALL)NOPASSWD:ALL #return the right permissions to the file sudo chmod 440 /etc/sudoers.d/useradm
0
ответ дан 24 July 2018 в 18:23

Вы можете изменить файл sudoers.

Запустить sudo visudo.

Добавить запись для вашего имени пользователя и скрипта, который вы хотите запустить, без запроса для пароля.

username ALL=(ALL) NOPASSWD: /path/to/script
29
ответ дан 24 July 2018 в 18:23
  • 1
    Не работала для меня, но спасибо, приятно знать, что это существует. Возможно, я неправильно понял синтаксис. – Chris K 31 July 2015 в 02:02
  • 2
    Не уверен, что кто-то упомянул об этом, но вы должны завершить все сеансы входа этого пользователя после редактирования файла sudoers. – escape-llc 12 November 2015 в 21:54
  • 3
    Чтобы пояснить здесь, это не сценарий, содержащий «sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql & quot; которая должна быть указана в файле sudoers, но скрипт playback_delete_data_patch.sh или любая другая команда, которую вы хотите, чтобы этот пользователь и / или их скрипты могли работать через sudo без указания пароля. – MttJocy 8 July 2016 в 22:42

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

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