Opsi su - menjalankan perintah sebagai pengguna lain

75

Saya ingin tahu bagaimana menjalankan perintah sebagai pengguna lain dari skrip.

Saya memiliki pemilik skrip yang ditetapkan sebagai root. Saya juga menjalankan perintah berikut dalam skrip untuk menjalankan perintah sebagai pengguna hudson:

su -c command hudson

Apakah ini sintaks yang benar?

pemulung
sumber
Untuk googler lain: beberapa pengguna mungkin menonaktifkan kemampuan ini dengan sengaja. Anda bisa lari sudo cat /etc/passwd | grep user-abc. Jika Anda melihat sesuatu seperti ini: user-abc:x:994:994::/home/user-abc:/bin/falsemaka itu tidak akan berhasil. Itu karena " /bin/false" bagian terakhir berarti tidak ada shell untuk pengguna itu.
Alexander Bird

Jawaban:

78

Iya. Inilah --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

Dan beberapa pengujian (saya menggunakan sudokarena saya tidak tahu kata sandi untuk nobodyakun)

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

Ketika perintah Anda mengambil argumen, Anda perlu mengutipnya. Jika tidak, hal-hal aneh akan terjadi. Inilah saya - sebagai root - mencoba membuat direktori di / home / oli (as oli) tanpa mengutip perintah lengkap:

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

Ini hanya dibaca mkdirsebagai nilai untuk -cbendera dan sedang digunakan /home/oli/javasebagai nama pengguna. Jika kami mengutipnya, itu hanya berfungsi:

# 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
sumber
52

Catatan: "Saya memiliki pemilik skrip yang ditetapkan sebagai root" tidak melakukan apa-apa; bahkan jika Anda memiliki bit setuid set masih tidak bekerja


Namun, dengan asumsi Anda menjalankan skrip sebagai root, Anda dapat menggunakannya sudo. suterutama untuk beralih pengguna, sedangkan sudountuk mengeksekusi perintah sebagai pengguna lain. The -uflag memungkinkan Anda menentukan mana pengguna untuk mengeksekusi perintah sebagai:

sudo -u hudson command
Michael Mrozek
sumber
1
Banyak kali saya menghadapi (pada sistem di mana sudoers baik-dikelola) yang mencoba untuk menggunakan sudoAnda hanya bisa mendapatkan ini: root is not in the sudoers file. Yang membuat su - <username> -c "command to run"satu-satunya pilihan.
RAM237
Kutipan tidak diperlukan saat menjalankan perintah non-sepele. (Misalnya, sudo -u kilgore mv this that)
toraritte