Saya memiliki skrip dijalankan dari crontab pengguna yang tidak memiliki hak istimewa yang meminta beberapa perintah menggunakan sudo
. Kecuali tidak. Script berjalan dengan baik tetapi perintah sudo'ed diam-diam gagal.
Script berjalan dengan sempurna dari shell sebagai pengguna yang dimaksud.
Sudo tidak memerlukan kata sandi. Pengguna yang bersangkutan memiliki
(root) NOPASSWD: ALL
akses yang diberikan pada/etc/sudoers
.Cron menjalankan dan menjalankan skrip. Menambahkan sederhana
date > /tmp/log
menghasilkan keluaran pada waktu yang tepat.Itu bukan masalah izin. Sekali lagi skrip dieksekusi, tidak hanya perintah sudo'ed.
Itu bukan masalah jalur. Menjalankan
env
dari dalam skrip yang sedang dijalankan menunjukkan$PATH
variabel yang benar yang menyertakan path ke sudo. Menjalankannya menggunakan jalur lengkap tidak membantu. Perintah yang dieksekusi diberi nama path lengkap.Mencoba menangkap keluaran dari perintah sudo termasuk STDERR tidak menunjukkan sesuatu yang berguna. Menambahkan
sudo echo test 2>&1 > /tmp/log
ke skrip menghasilkan log kosong.Sudo biner itu sendiri mengeksekusi dengan baik dan mengakui bahwa ia memiliki izin bahkan ketika dijalankan dari cron di dalam skrip. Menambahkan
sudo -l > /tmp/log
ke skrip menghasilkan output:Pengguna ec2-pengguna dapat menjalankan perintah berikut pada host ini:
(root) NOPASSWD: ALL
Memeriksa kode keluar dari perintah menggunakan $?
menunjukkan itu mengembalikan kesalahan (kode keluar:) 1
, tetapi tampaknya tidak ada kesalahan yang dihasilkan. Perintah sesederhana /usr/bin/sudo /bin/echo test
mengembalikan kode kesalahan yang sama.
Apa lagi yang bisa terjadi?
Ini adalah mesin virtual yang baru dibuat yang menjalankan AMI Amazon Linux terbaru. Crontab milik pengguna ec2-user
dan file sudoers adalah distribusi default.
The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoers
dan otak saya mulai berteriak terlalu keras untuk terus membaca.sudo
hak terbatas / hanya / untuk perintah yang Anda butuhkan dalam skrip dan menonaktifkan sepenuhnya kemampuan login mereka.Jawaban:
Sudo memiliki beberapa opsi khusus dalam file izinnya, salah satunya memungkinkan pembatasan penggunaannya pada shell yang berjalan di dalam TTY, yang bukan cron.
Beberapa distro termasuk Amazon Linux AMI mengaktifkannya secara default. The
/etc/sudoers
File akan terlihat seperti ini:Jika Anda telah menangkap output ke STDERR di tingkat skrip shell daripada perintah sudo itu sendiri, Anda akan tampak seperti pesan:
Solusinya adalah mengizinkan sudo dieksekusi di lingkungan non TTY baik dengan menghapus atau mengomentari opsi ini:
sumber
Defaults !visiblepw
dihidupkan / tidak dikomentari.