Команди в сценарії виконуються по черзі незалежно. Сам скрипт, як батько всіх команд у сценарії, є ще одним незалежним процесом, і команда su не може і не може змінити його на root: команда su створює новий процес з root правами.
Після того, як команда su завершиться, батьківський процес, який все ще працює як той самий користувач, виконає решту сценарію.
Що ви хочете зробити, це написати сценарій обгортки. Привілейовані команди переходять, наприклад, до основного сценарію~/main.sh
#!/bin/sh
ls /root
Скрипт обгортки викликає основний скрипт із дозволами root, як це
#!/bin/sh
su -c ~/main.sh root
Для запуску цього процесу ви запускаєте обгортку, яка, в свою чергу, запускає основний скрипт після переходу користувача на root користувача.
Цю техніку обгортки можна використовувати для перетворення сценарію в обгортку навколо себе. В основному перевірте, чи працює він як root, якщо ні, використовуйте "su", щоб перезапустити себе.
$ 0 - це зручний спосіб змусити скрипт посилатися на себе, і команда whoami може сказати нам, хто ми є (чи ми root?)
Так стає основним сценарієм із вбудованою обгорткою
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Зверніть увагу на використання exec. Це означає "замінити цю програму на", що фактично закінчує її виконання і запускає нову програму, запущену su, з root, щоб запустити зверху. Екземпляр заміни "root", тому він не виконує праву частину ||
sudo su
змушує мене боліти очі.