Как запускать команды от имени другого пользователя в сценариях Linux

Опубликовано: 2022-07-13
Терминал Linux на ноутбуке на синем фоне.
Фатмавати Ачмад Заэнури/Shutterstock.com

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

У процессов есть владельцы

Когда программа или сценарий выполняются, Linux создает процесс. У этого процесса есть владелец. Владелец — либо другой процесс, либо имя учетной записи пользователя, если ее запустил человек.

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

Как управлять процессами из терминала Linux: 10 команд, которые нужно знать
СВЯЗАННЫЕ С : Как управлять процессами из терминала Linux: 10 команд, которые вам нужно знать

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

Каждый раз, когда мы используем sudo , мы запускаем команду от имени другого пользователя. Учетная запись пользователя по умолчанию, используемая sudo , — это пользователь root или «супер». Из-за этого sudo часто ошибочно принимают за суперпользователя do . Но это всего лишь вялый жаргон. На самом деле это означает замещающий пользователь .

С помощью sudo вы можете запускать команды как любой другой пользователь, а не только как root. Как ни странно, для этого вам нужны привилегии root. Но запуск программы или сценария, принадлежащего другому пользователю, — это не то же самое, что запуск этого процесса от имени этого другого пользователя. Вы по-прежнему будете запускать его как root.

Вот как на самом деле запустить процесс от имени другого пользователя и как запустить команды из скрипта, как если бы они были выполнены другим пользователем.

Запустить скрипт от имени другого пользователя

Мы используем компьютер, на котором настроено несколько пользователей. Один из них — Мэри с именем пользователя maryq, а другой — Дэйв с именем пользователя dave.

У Мэри есть сценарий под названием «other-user.sh» в ее домашнем каталоге. Это текст сценария.

 #!/бин/баш

echo "Имя скрипта:" $0
echo "Рабочий каталог:" $(pwd)
echo "Сценарий работает от имени пользователя:" $(whoami)

Он выводит имя сценария, которое содержится в переменной окружения $0 . Затем он использует pwd для печати рабочего каталога. Наконец, он использует команду whoami для вывода имени пользователя, запустившего скрипт. Или кто, по его мнению , запустил сценарий.

Скопируйте текст из сценария в редактор и сохраните его как «other-user.sh» в домашнем каталоге другой учетной записи пользователя.

Нам нужно сделать скрипт исполняемым. Мы воспользуемся командой chmod и используем параметр +x (выполнение) и параметр -u (пользователь), чтобы установить флаг выполнения только для владельца. Это означает, что только Мэри может запустить сценарий. Мы проверим права доступа к файлу с помощью ls .

 chmod u+x другой-user.sh
 лс 

Установка разрешения на выполнение для скрипта, чтобы его мог запустить только пользователь Мэри.

Слева направо разрешения читаются:

  • Владелец может читать, записывать и выполнять файл.
  • Члены группы могут читать и записывать файл.
  • Другие могут только читать файл.

Таким образом, единственными пользователями, способными запустить сценарий, являются Мэри и root. Вот что происходит, когда Мэри запускает сценарий:

 ./другой-user.sh 

Вывод, когда Мэри запускает скрипт

Нам сообщают, что текущим рабочим каталогом сценария является домашний каталог Мэри, а владельцем сценария является учетная запись пользователя maryq.

Как и ожидалось, Дейв не может запустить сценарий.

 /home/maryq/other-user.sh 

Пользователь Dave не может запустить скрипт, разрешение отклонено

Если у Дэйва есть привилегии пользователя root, он может попытаться запустить скрипт от имени root, используя sudo .

 sudo /home/maryq/other-user.sh 

Вывод при запуске скрипта от root

Это частичный успех. Скрипт запускается, но владельцем скрипта является root, а не maryq.

Уловка, которую нам нужно использовать, — это опция sudo -u (user). Это позволяет вам указать пользователя, от имени которого вы хотите запустить команду. Если вы не используете параметр -u , sudo по умолчанию использует root. Если мы хотим запустить команду от имени Мэри, нам нужно передать имя их учетной записи пользователя в команду sudo .

sudo -u maryq /home/maryq/other-user.sh

Использование опции пользователя -u с правами root для запуска скрипта от имени пользователя Мэри.

На этот раз скрипт сообщает, что владельцем процесса является maryq.

Добавим строчку в скрипт «other-user.sh». Мы echo некоторый текст и перенаправим вывод в файл с именем «mary.txt».

 #!/бин/баш

echo "Имя скрипта:" $0 
echo "Рабочий каталог:" $(pwd) 
echo "Сценарий работает от имени пользователя:" $(whoami)
echo "Это идет в файл в /home/maryq/" > /home/maryq/mary.txt

Мы создаем новый файл в домашнем каталоге Мэри. Это прекрасно, потому что мы запускаем сценарий от имени Мэри.

 ./другой-user.sh 

Запуск скрипта еще раз, чтобы он создал текстовый файл

Если мы проверим домашний каталог Мэри, мы увидим, что файл был создан, и право собственности на файл принадлежит учетной записи пользователя maryq.

 ls -hl mary.txt 

Проверка права собственности на файл, созданный скриптом

Это то же самое поведение, которое мы увидели бы, если бы Мэри сама запустила сценарий.

СВЯЗАННЫЕ С: Как использовать команду chmod в Linux

Команда runuser

Вы можете использовать команды sudo -u , которые мы использовали до сих пор внутри скрипта, но есть еще одна команда, runuser , которая предназначена для запуска процессов от имени другого пользователя из скриптов. Он лучше обрабатывает код возврата из запущенного процесса и имеет меньше накладных расходов, чем sudo .

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

Дэйв не может перечислить файл «mary.txt», потому что он находится в домашнем каталоге Мэри, и у него нет к нему доступа.

 кошка /home/maryq/mary.txt 

Пользователь Dave не может прочитать файл Мэри, разрешение отклонено

Однако мы можем заглянуть внутрь файла с помощью runuser . Параметр - (login) запускает новую оболочку со средой, очень близкой к среде оболочки, которая была бы у Мэри, если бы они действительно вошли в систему. После опции -c (command) следует команда, которую мы хотим запустить.

 sudo runuser - maryq -c 'кот mary.txt' 

Чтение файла Мэри с помощью команды runuser

Обратите внимание, что команде не нужен полный путь к файлу. Мы можем ссылаться на файл так же, как Мэри, относительно ее домашнего каталога.

Как пользователь Дейв, мы создадим скрипт под названием «run-maryq.sh» с этим текстом:

 #!/бин/баш

runuser -l maryq -c 'кот mary.txt'

Сделаем его исполняемым:

 chmod +x запустить-maryq.sh 

Делаем скрипт исполняемым с помощью chmod

Давайте посмотрим, что произойдет, когда мы попытаемся запустить его.

 ./run-maryq.sh 

Запуск скрипта с runuser внутри, как обычный пользователь

Команда runuser жалуется, потому что она выполняется обычным пользователем. Давайте снова запустим его с помощью sudo .

 sudo ./run-maryq.sh 

Запуск скрипта с runuser внутри, как root

Это работает так, как мы хотели, и точно так же, как если бы Мэри сама запустила сценарий.

Какой из них использовать?

В командной строке между ними не так много выбора. Но так как вы все равно должны использовать sudo с runuser , вы можете также использовать sudo отдельно.

Но в сценарии runuser является предпочтительной командой.

СВЯЗАННЫЕ: 10 основных команд Linux для начинающих