Поиск по сайту:

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


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

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

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

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

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

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

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

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

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

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

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

#!/bin/bash

echo "Script name:" $0
echo "Working directory:" $(pwd)
echo "Script running as user:" $(whoami)

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

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

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

chmod u+x other-user.sh
ls

Слева направо права доступа гласят:

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

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

./other-user.sh

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

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

/home/maryq/other-user.sh

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

sudo /home/maryq/other-user.sh

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

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

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

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

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

#!/bin/bash

echo "Script name:" $0 
echo "Working directory:" $(pwd) 
echo "Script running as user:" $(whoami)
echo "This is going into a file in /home/maryq/" > /home/maryq/mary.txt

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

./other-user.sh

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

ls -hl mary.txt

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

Команда runuser

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

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

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

cat /home/maryq/mary.txt

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

sudo runuser - maryq -c 'cat mary.txt'

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

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

#!/bin/bash

runuser -l maryq -c 'cat mary.txt'

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

chmod +x run-maryq.sh

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

./run-maryq.sh

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

sudo ./run-maryq.sh

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

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

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

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