jalankan skrip sebagai pengguna yang memiliki shell nologin

87

Yang perlu saya lakukan adalah menjalankan skrip tertentu sebagai pengguna tertentu yang memiliki nologin/falseshell yang ditunjukkan /etc/passwd.

Saya akan menjalankan skrip sebagai root dan ini harus dijalankan sebagai pengguna lain. Berlari:

~# su -c "/bin/touch /tmp/test" testuser

akan bekerja, tetapi saya perlu shell yang valid untuk penguji. Saya tahu saya dapat menonaktifkan kata sandi dengan passwd -d testuserdan membiarkan shell dengan /bin/bashcara ini akan sedikit aman tetapi saya harus memiliki nologin/falseshell.

Pada dasarnya yang saya butuhkan adalah apa yang crontabdilakukan ketika kita menetapkan pekerjaan yang akan dijalankan sebagai pengguna tertentu, terlepas dari yang ini memiliki nologin/falseshell.

ps Saya menemukan utas ini Melaksanakan perintah sebagai pengguna nologin , tapi saya tidak tahu bagaimana concatenateperintah su -s /bin/sh $userke skrip yang perlu saya jalankan.

Tommaso
sumber

Jawaban:

119

Anda dapat menggunakan -s untuk su untuk menjalankan shell tertentu

su -s /bin/bash -c '/path/to/your/script' testuser

(Sertakan sudodi atas jika testuseradalah pengguna tanpa kata sandi.)

Iain
sumber
Bagaimana jika su root:root -rwsr-x---?
Patryk
1
Bagaimana jika pengguna tidak memiliki kata sandi?
CMCDragonkai
3
@Wesley Mengetahui bahwa Anda perlu root untuk menjalankan perintah itu untuk pengguna tanpa kata sandi.
CMCDragonkai
1
@lain, Jika pengguna seharusnya tidak memiliki shell, proses yang terkait dengan perintah seharusnya bukan anak dari proses bash. Dengan demikian, Anda juga harus menggunakan exec untuk mengganti shell dengan skrip. Dan jika Anda ingin menjadikan skrip sebagai anak init, Anda cukup menggunakan &, sebagai contohsu -s /bin/bash -c 'exec /path/to/your/script &' test
Facundo Victor
1
Karena saya telah menghabiskan 20 menit terakhir mencari cara untuk mencapai hasil yang sama menggunakan runuser, saya ingin menunjukkan bahwa su -s SHELLparameter membuat perintah runuser cukup berguna :) Terima kasih Jan!
jirka
12

Anda dapat melakukannya dengan sudo -umenginstalnya:

# whoami
root
# sudo -u apache whoami
apache
# getent passwd apache
apache:x:48:48:Apache:/var/www:/sbin/nologin
Handyman5
sumber
Bagaimana Anda meneruskan parameter sudo -u apache whoami?
CMCDragonkai
@CMCDragonkai Parameter apa pun setelah perintah akan diteruskan. Anda dapat menganggapnya seperti "sudo [-u apache] [whoami <param1> <param2>]".
Handyman5
Saya pikir menggunakan sudo -umungkin bukan ide yang baik untuk menjalankan perintah sebagai pengguna nologin, karena mengekspos SUDO_USERdi lingkungan siapa yang sebenarnya memanggil perintah. Mungkin saya hanya terlalu memikirkannya.
Meow
5

Dengan menyediakan skrip sebagai argumen untuk dieksekusi ke / bin / sh:

su -s "/bin/sh /your/script/location" username
adaptr
sumber
2

baru sadar :

su -s "/ bin / bash" -c "/ bin / touch / tmp / testuser" testuser "

mungkin ada cara yang lebih baik ?!

Tommaso
sumber
0

sebenarnya, cara terbaik untuk melakukan ini adalah melalui runuser

lihat halaman manual untuk detailnya

alat ini digunakan untuk menghadapi situasi seperti yang dikatakan pengembang di bolg-nya

Setiap kali layanan berjalan sebagai root dan ingin mengubah UID menggunakan shell itu harus menggunakan runuser.

http://danwalsh.livejournal.com/55588.html

Saya sudah mengirim jawaban ini di banyak istana, maafkan saya jika Anda menemukan ini menjengkelkan

Z-Y00
sumber
Harap jangan memposting jawaban hanya tautan untuk mencegah pembusukan tautan. Alih-alih, tambahkan informasi yang paling relevan dari tautan ke jawaban Anda atau sebagai alternatif, poskan tautan sebagai komentar alih-alih jawaban. Lihat serverfault.com/help/how-to-answer artikel pusat bantuan ini untuk informasi lebih lanjut.
Federico Galli
@FedericoGalli informasi yang paling relevan sudah ditambahkan, tidak perlu menyalin dan menempel penggunaan, halaman manual memberikan informasi yang cukup
Z-Y00
-1

Gunakan sudo -u untuk menentukan pengguna. Juga gunakan flag -i untuk mengatur variabel lingkungan dari pengguna target juga.

sudo -i -u user command
Wayne Shelley
sumber
1
ini memberiThis account is currently not available.
knocte
-3

Gunakan perintah su dengan perintah shell -s dan -c. Seperti yang ditunjukkan di bawah ini

 su  exec -l -c '/bin/bash /etc/update_conf.sh' -s /bin/bash
chetan
sumber
2
Itulah solusi dari jawaban berperingkat tertinggi.
Gerald Schneider