Jalankan bagian dari skrip bash sebagai pengguna yang berbeda

Jawaban:

42

Gunakan perintah sudo dalam skrip.

Dalam bentuk:

sudo -u username command

perintah sudo menjalankan perintah sebagai nama pengguna pengguna .

Jika skrip dijalankan sebagai root, saya tidak berpikir itu akan meminta kata sandi. Jika tidak, artikel ini membahas cara menggunakan sudo dengan kata sandi dalam satu baris perintah? , dan artikel ini membahas cara menggunakan sudo tanpa kata sandi?

pcapademic
sumber
5
Ini bagus dan mudah, tetapi adakah cara untuk melakukan ini untuk sekelompok perintah alih-alih satu per satu?
Andrew
menulis skrip bash, membuatnya dapat dieksekusi chmod +x script.shdan kemudiansudo -u username script.sh
NiCU
@Andrew Saya bertanya-tanya sendiri dan berikut ini bekerja untuk saya: sudo -u ic sh -c 'cmd1 && cmd2'
Karussell
Juga sertakan iopsi jika Anda ingin mendapatkan lingkungan pengguna
neoDev
6

Jawaban ini bagus, tetapi saran serverfault sedikit berbahaya - akan memungkinkan siapa saja untuk menjalankan apa pun sebagai root! Jadi saya memposting di sini karena saya tidak dapat memformat komentar.

Saya akan merekomendasikan menggunakan visudo untuk memberikan izin yang Anda butuhkan setepat mungkin. Ketik visudodan tambahkan baris seperti:

username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2

Jika Anda perlu menjalankan hal yang sama di banyak host, Anda dapat membukanya dengan:

username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2

Tapi saya ** tidak * akan menggunakan:

username ALL=(ALL) NOPASSWD: ALL

atau nama pengguna hostname = SEMUA

The man page sudoer memiliki banyak rincian berdarah

DaveParillo
sumber
Apakah ini akan berfungsi untuk perintah yang hanya tersedia untuk pengguna tertentu?
Manish Mathai
Anda dapat menentukan bahwa hanya pengguna tertentu yang dapat menjalankan perintah (dalam contoh di atas, ganti usernamedengan nama pengguna yang seharusnya dapat menjalankan perintah). Jika executable yang ingin Anda jalankan hanya dapat dieksekusi oleh satu pengguna tertentu, itu juga tidak masalah - cukup berikan nama pengguna di sudo -u username commandlinebaris skrip.
James Polley
@Manish. Iya nih. Apa yang dikatakan file sudoers adalah "Izinkan nama pengguna ini pada host ini untuk menjalankan command1 tanpa harus memberikan kata sandi.
DaveParillo
6

# I = suka:

#test if running bash as a different user works
sudo -u nobody bash -c : && RUNAS="sudo -u nobody"

echo 1: $USER

#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_

echo 3: $USER

# ./run

1: root
2: nobody
3: root
Lab AX
sumber
10
Bisakah Anda menambahkan beberapa teks penjelasan?
Kazark
4

Untuk sonarqube:

sudo -u sonar /usr/bin/sonar start

di mana sonarnama pengguna yang digunakan untuk menjalankan perintah/usr/bin/sonar start

burtsevyg
sumber
2

tidak begitu yakin tentang hal itu, tetapi jika Anda menginginkan HANYA akhir skrip itu akan berjalan sebagai pengguna yang berbeda, Anda dapat menambahkan su someusersebelum akhir skrip.

Apakah saya melewatkan sesuatu?

Semoga itu bisa membantu,

Salam

dag729
sumber
1
Saya pikir ini adalah jawaban yang paling tepat, memiliki semua jawaban lain yang menyarankan sudo, yang sering tidak diinstal secara default pada beberapa instalasi linux minimal.
Tim
1

Dengan cara ini, akhir skrip akan dieksekusi oleh pengguna yang berbeda (root). Harap perhatikan $[LINENO+2]dan exit $?panggilan. Ini diperlukan untuk membuat akhir skrip untuk mengeksekusi hanya sekali dan untuk menjaga kode sudopanggilan keluar.

#!/bin/bash                                                                                                                                                                                                                                  
echo $USER                                                                                                                                                                                                                                      

# pipe the rest of this script via a sudo call                                                                                                                                                                                                                                         
tail -n +$[LINENO+2] $0 | exec sudo bash                                                                                                                                                                                                     
exit $?                                                                                                                                                                                                                                     
echo $USER
exit 1
dparalen
sumber