it-swarm-ru.tech

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

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

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

su -c command hudson

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

86
garbagecollector

Да. Вот --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: -
89
Oli

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


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

Sudo -u hudson command
58
Michael Mrozek