su options - запуск команды от имени другого пользователя

76

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

У меня есть владелец скрипта, установленный как root. У меня также есть следующая команда, запускаемая в скрипте для запуска команды от имени пользователя hudson:

su -c command hudson

Это правильный синтаксис?

уборщик мусора
источник
Для других googlers: у некоторых пользователей эта возможность может быть отключена специально. Ты можешь бежать sudo cat /etc/passwd | grep user-abc. Если вы видите что-то вроде этого: user-abc:x:994:994::/home/user-abc:/bin/falseтогда это не сработает. Это потому, что последняя часть " /bin/false" означает, что для этого пользователя нет оболочки.
Александр Берд

Ответы:

80

Да. Вот это --help:

$ su --help
Usage: su [options] [LOGIN]

Options:
  -c, --command COMMAND         pass COMMAND to the invoked shell
  -h, --help                    display this help message and exit
  -, -l, --login                make the shell a login shell
  -m, -p,
  --preserve-environment        do not reset environment variables, and
                                keep the same shell
  -s, --shell SHELL             use SHELL instead of the default in passwd

И некоторое тестирование (я использовал, sudoпоскольку я не знаю пароль для nobodyучетной записи)

$ sudo su -c whoami nobody
[sudo] password for oli: 
nobody

Когда ваша команда принимает аргументы, вы должны заключить ее в кавычки. Если вы этого не сделаете, странные вещи будут происходить. Здесь я - как root - пытаюсь создать каталог в / home / oli (как oli) без кавычек полной команды:

# su -c mkdir /home/oli/java oli
No passwd entry for user '/home/oli/java'

Он только читается mkdirкак значение для -cфлага и пытается использовать в /home/oli/javaкачестве имени пользователя. Если мы процитируем это, это просто работает:

# su -c "mkdir /home/oli/java" oli
# stat /home/oli/java
  File: ‘/home/oli/java
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 811h/2065d  Inode: 5817025     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/     oli)   Gid: ( 1000/     oli)
Access: 2016-02-16 10:49:15.467375905 +0000
Modify: 2016-02-16 10:49:15.467375905 +0000
Change: 2016-02-16 10:49:15.467375905 +0000
 Birth: -
Oli
источник
52

Примечание: «У меня есть владелец скрипта, установленный как root», ничего не делает; даже если у вас установлен бит setuid, он все равно не работает


Предполагая, что вы на самом деле запускаете скрипт от имени пользователя root, вы можете использовать его sudo. suв первую очередь для переключения пользователей, а sudoдля выполнения команд, как и другие пользователи. -uФлаг позволяет указать , какой пользователь , чтобы выполнить команду , как:

sudo -u hudson command
Михаил Мрозек
источник
1
Я много раз столкнулся (на системах , где sudoers хорошо вводит) , которые пытаются использовать sudoвы можете только получить это: root is not in the sudoers file. Что делает su - <username> -c "command to run"единственный вариант.
RAM237
Кавычки не нужны при выполнении нетривиальной команды. (Например, sudo -u kilgore mv this that)
тораритте