Запропонуйте користувачеві увійти як корінь під час запуску сценарію оболонки


17

Проблема, яку я отримую, - це коли я ввожу команду,

su - root

на початку мого файлу сценарію оболонки він пропонує користувачеві ввести пароль, а потім НЕ продовжуватиметься з рештою скрипту оболонки. Потім мені доведеться вручну знайти та запустити скрипт оболонки через термінал. Я хочу, щоб сценарій переконався, що користувач увійде в систему як root, а потім продовжить решту сценарію оболонки.

Іншими словами, я хочу запустити скрипт як будь-який користувач, але як тільки скрипт починає виконуватись, користувач повинен змінитися на root, а потім продовжувати роботу з рештою сценарію як root, поки це не буде зроблено. Чи можна це зробити?

Відповіді:


34

Це дуже легко здійснити:

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

Якщо поточний користувач не має root, повторно виконайте скрипт sudo.

Зауважте, що я sudoтут використовую замість цього su. Це тому, що дозволяє зберегти аргументи. Якщо ви використовуєте su, ваша команда повинна бути такою, su -c "$0 $@"яка б переробляла ваші аргументи, якщо вони мають пробіли або спеціальні символи оболонки.

Якщо ваша оболонка ударила, ви можете уникнути зовнішнього виклику whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"

На жаль, я зробив помилку в поясненні, тому воно могло бути неправильно трактоване. Ось більш чітке пояснення. Дякую за допомогу!
Редсон

@ user68857 Ваше питання було зрозумілим. Ця відповідь робить саме те, що ви хочете.
Патрік

я продовжую отримувати цю помилку: sudo: повинен бути встановлений root
Редсон

я хочу запустити скрипт як звичайний користувач через термінал, але сценарій повинен потім переключити користувача на root до кінця сценарію
Редсон

@Nosscire, якщо ви отримуєте sudo: must be setuid root, то з вашим судом щось сталося. Щоб виправити це: chmod u+s $(which sudo). І так, я добре знаю, що ти намагаєшся робити, я весь час роблю те саме за своїми сценаріями.
Патрік

7

Ви також можете перевірити UID:

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi

5

Ви можете зателефонувати самому сценарію і перевірити:

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...

0

У місці, де ви хочете увійти, просто додайте наступну команду

sudo su

Це прекрасно працює з моїм кодом

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.