Что делает команда 'sudo -s' и как она используется в этом примере?

8

У меня есть следующие сомнения. В учебном пособии по установке программного обеспечения, которое я следую, говорится, что я должен выполнить следующие команды (я делаю это в оболочке ssh , поэтому этот список шагов заканчивается exitкомандой):

sudo -s
apt-get update
apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen
exit

Мои сомнения:

Что именно делает -sпараметр после sudoкоманды?

Поиск в сети, я обнаружил, что:

‑S [команда] Опция ‑s (shell) запускает оболочку, указанную в переменной среды SHELL, если она установлена, или оболочку, указанную в базе данных паролей. Если указана команда, она передается в оболочку для выполнения через параметр оболочки ‑c. Если команда не указана, выполняется интерактивная оболочка

Мне кажется, что sudo -sвыполнить команду, используя переменную окружения оболочки.

Но для меня это не ясно: в каком случае команда выполняется с переменной среды? (это только выполняет, sudo -sа не sudo -s [command]).

AndreaNobili
источник

Ответы:

7

Ответ прост: он дает вам корневую оболочку. Вот для чего он здесь используется. Там хорошее техническое сравнение между su, sudo -i, sudo -sи sudo suметоды по Unix.SE , но это действительно не имеет отношения здесь. Код мог бы использовать любой и работал бы.

Слепок помощи означает несколько вещей:

  • Он ищет команду в $SHELLпеременной окружения. Если вы побежите, echo $SHELLвы, вероятно, увидите /bin/bash. Это означает, что вы получите корневой экземпляр Bash. Я уверен, что если бы вы были в zshэтом, это означало бы, что вы получите корневой экземпляр zsh.

  • Если $SHELLон пуст, он возвращается к оболочке по умолчанию, определенной /etc/passwdдля этого пользователя.

  • Если вы предоставляете команду (например sudo -s whoami), она фактически выполняется:sudo /bin/bash -c "whoami"

  • Если вы не передаете команду, она не передает -cаргумент, поэтому вы просто получаете интерактивную оболочку.

Я использовал фразу «корень» несколько раз. По умолчанию sudo все работает как root, но sudo(и su) может запускать все как другие пользователи (если у вас есть разрешение на это). Я утверждаю это только для педантов, которые будут кричать, которые sudo -s -u $USERне дают им корневую оболочку, как я обещал -sвыше.


И, по моему скромному мнению, действительно глупо становиться пользователем root только для двух команд, не говоря уже о том, что это может привести к тому, что пользователь случайно запустит дальнейшие команды от имени root. Если вы хотите или вам нужно запустить что-то от имени root, просто добавьте команду с помощью sudo:

sudo apt-get update
sudo apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen

Я сомневаюсь в любом уроке, который предлагал бы получить корневую оболочку, кроме случаев, когда у вас есть куча команд для запуска ... И даже тогда, есть сценарии.

Оли
источник
Идеальное объяснение. Теперь все стало понятнее. Последнее сомнение Если я добавлю sudo ко всем предыдущим командам, я получу тот же конечный результат? это правда или я что-то упустил?
AndreaNobili
@ Оли вы на 100% правы в отношении Zsh, «sudo -s» входит в «корневую» оболочку как «root», а не как Super User.
RCF
@AndreaNobili Да, это то, что sudoобычно для; Выполнение команды от имени пользователя root без необходимости вручную входить в систему как пользователь root.
Оли
К вашему сведению, я разместил ответ ниже вашего, и мое мнение sudo -sкардинально отличается от моих ограниченных знаний и случайных ситуаций. Тем не менее, вы, возможно, захотите прочитать мой «скромный» ответ и, возможно, освежить свой 1/2-летний ответ.
WinEunuuchs2Unix
0

sudo -sвыполнит команду в текущем каталоге, как обычный пользователь. Например:

rick@alien:~/askubuntu$ suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
Nov 12 22:23:37 to Nov 13 04:24:37 lasting 21,660 seconds
(... SNIP ...)
Dec 02 21:58:49 to Dec 03 04:20:52 lasting 22,923 seconds
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,356 seconds (21 days, 12 hours, 29 minutes, 16 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,015 seconds (7 days, 22 hours, 33 minutes, 35 seconds)

rick@alien:~/askubuntu$ sudo suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -H suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -s suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
(...SNIP...)
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,431 seconds (21 days, 12 hours, 30 minutes, 31 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,090 seconds (7 days, 22 hours, 34 minutes, 50 seconds)

Конечно, использование -sвместо префикса команды ./не может быть очень выгодно для экономии времени.

WinEunuuchs2Unix
источник