su options - виконання команди як іншого користувача


75

Мені було цікаво, як запустити команду як інший користувач із сценарію.

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

su -c command hudson

Це правильний синтаксис?


Для інших Google: деякі користувачі можуть спеціально відключити цю здатність. Можна бігати sudo cat /etc/passwd | grep user-abc. Якщо ви бачите щось подібне: user-abc:x:994:994::/home/user-abc:/bin/falseце не спрацює. Це тому, що остання частина " /bin/false" означає, що для цього користувача немає оболонки.
Олександр Птах

Відповіді:


78

Так. Ось --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: -

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)
торарітте
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.