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.

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.)


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

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

2

baru sadar :

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

mungkin ada cara yang lebih baik ?!


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


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

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

2
Itulah solusi dari jawaban berperingkat tertinggi.
Gerald Schneider
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.