Saya memiliki program yang harus berperilaku berbeda jika sedang dijalankan di bawah "sudo". Apakah ada cara untuk mengetahui apakah itu dijalankan di bawah sudo?
Pembaruan: Seseorang bertanya mengapa saya ingin melakukan ini. Dalam hal ini, pada Mac menggunakan MacPorts ada output yang memberitahu Anda untuk memotong dan menempelkan perintah tertentu. Jika perintah MacPorts dijalankan dengan "sudo", itu harus menyertakan sudo dalam perintah sampel:
$ sudo port selfupdate
---> Updating MacPorts base sources using rsync
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
---> Updating the ports tree
---> MacPorts base is already the latest version
The ports tree has been updated. To upgrade your installed ports, you should run
port upgrade outdated
^^^^^^^^^ it would be really sweet if it output "sudo port upgrade outdated" instead. It would be even better if it just did it for you :-)
Jawaban:
Ya, ada 4 variabel lingkungan yang ditetapkan ketika suatu program berjalan di bawah sudo:
Perhatikan bahwa ini dapat dipalsukan dengan hanya mengaturnya. Jangan percayai mereka untuk hal-hal penting.
Sebagai contoh: Dalam program ini kita perlu memberi tahu pengguna untuk menjalankan beberapa program lain. Jika yang sekarang dijalankan dengan sudo, yang lain juga.
Perhatikan bahwa ini hanya menguji variabel SUDO_ * jika pertama dapat membuktikan bahwa itu berjalan sebagai root. Bahkan kemudian hanya menggunakannya untuk mengubah beberapa teks bermanfaat.
sumber
Ini tidak menjawab pertanyaan secara langsung tetapi saya tidak berpikir pertanyaan yang tepat diajukan di sini. Sepertinya saya penanya menginginkan program yang akan bertindak berbeda mungkin jika memiliki izin tertentu atau tidak, namun saya berpendapat bahwa memeriksa sudo bukanlah cara untuk melakukan itu. Pertama banyak sistem mungkin tidak mengimplementasikan "sudo", itu sama sekali tidak diperlukan di Linux atau banyak Unix.
Misalnya seorang pengguna mungkin sudah login sebagai root, membuat sudo tidak masuk akal atau mungkin sistem memiliki pengguna non root yang masih memiliki kemampuan untuk melakukan tugas administratif yang mungkin ingin dilakukan oleh program. Akhirnya mungkin sistem tidak memiliki root atau sudo sama sekali dan sebagai gantinya menggunakan sistem kontrol akses wajib dengan kemampuan yang berbeda dan tidak menangkap semua pengguna super untuk sudo ke. Atau pengguna bisa saja sudoed, tetapi ke dalam akun yang memiliki -kurang-izin daripada akun mereka sendiri karena alasan keamanan (saya sering menjalankan kode yang tidak terpercaya dengan pengguna sementara yang tidak dapat diandalkan yang hanya dapat menulis ke ramdis untuk turun, tidak menaikkan izin saya ). Secara keseluruhan adalah ide yang buruk untuk mengasumsikan model izin khusus seperti sudo atau keberadaan root atau menganggap pengguna sudo memiliki hak istimewa tertentu.
Jika Anda ingin mengetahui apakah Anda memiliki izin untuk melakukan operasi, cara terbaik biasanya adalah dengan hanya mencoba dan melakukannya kemudian periksa errno untuk masalah izin jika gagal atau jika ini adalah operasi multi-tahap yang harus gagal atau berhasil. Anda dapat memeriksa apakah suatu operasi akan berfungsi dengan fungsi-fungsi seperti akses POSIX fungsi (waspadai kemungkinan kondisi balapan di sini jika izin diubah secara aktif)
Jika selain itu Anda perlu tahu pengguna sebenarnya di balik sudo Anda dapat menggunakan getlogin fungsi yang harus bekerja untuk setiap sesi interaktif dengan terminal yang mendasarinya dan akan memungkinkan Anda misalnya untuk menemukan siapa yang 'benar-benar' menjalankan perintah untuk mengaudit atau menemukan direktori home dari pengguna nyata untuk menyimpan log.
Akhirnya jika yang Anda inginkan adalah untuk mengetahui apakah pengguna memiliki akses root (Masih ide yang buruk tetapi kurang spesifik implementasi) Anda dapat menggunakan getuid untuk memeriksa uid dari 0 dan dengan demikian root.
sumber
Ada dua mekanisme yang bisa digunakan.
growisofs
tidak suka dijalankan di bawah SUDO, jadi saya hapus variabel SUDO di skrip tempat saya menggunakannya. Itu bisa dipalsukan dengan cara lain. (Variabel SUDO juga dibawa ke lingkungan untuk skrip dijalankan di bawah perintah at dan batch.)Lebih umum untuk memeriksa apakah Anda menjalankan sebagai pengguna yang sesuai. The
id
perintah dapat digunakan untuk melakukan hal ini. Skrip TomOnTime menggunakanid
perintah untuk menentukan apakahsudo
mungkin diperlukan untuk menjalankan perintah berikutnya.sumber
sudo
biner menjadi sesuatu yang lain? Atau sebutkan beberapa executable lainsudo
untuk memalsukan yang sebaliknya? Bukannya aku benar-benar berharap ada orang waras untuk melakukan itu ...root
akses untuk mengganti namasudo
executable. Pengguna normal tidak akan bisa melakukan ini. Saya memang mencatat bahwa Anda dapat berpura-pura bahwa Anda berjalan di bawahsudo
. Mengganti nama program yang ada akan berhasil. Kode yang diperlukan untuksudo
program palsu khusus sepele.Anda dapat membandingkan id pengguna efektif vs nyata.
Ini tidak berarti bahwa program ini sedang menjalankan undo sudo (bisa juga setuid'd), tetapi menunjukkan bahwa program memiliki lebih banyak hak daripada yang diharapkan pengguna. (misalnya dalam program yang biasanya dijalankan tanpa hak tersebut, tetapi perlu dijalankan dengan mereka selama instalasi atau untuk menginstal pembaruan. Kemudian, Anda dapat menggunakan ini untuk memberikan umpan balik peringatan tentang itu).
sumber
sudo
setel id efektif dan nyata. Berbeda dengan suid, yang tidak. Berikut ini adalah program C sepele yang dapat Anda gunakan untuk menguji (maaf, komentar akan menghapus baris baru, Anda harus menambahkannya kembali):#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("real = %i, effective = %i\n", getuid(), geteuid()); return 0; }
perl -E 'say $<, "\n", $>'
Anda dapat memeriksa variabel UID (EUID) yang efektif, sebagai berikut:
sumber
sudo echo $USER
mencetak nama pengguna yang tidak terjangkau (variabel diganti SEBELUM sudo). Saya akhirnya menggunakan kode Anda dalam skrip saya. Terima kasih!Anda dapat menyentuh file di
/root
dan kemudianif -e
. Dan jika -e benar,rm
(memeriksa kode kesalahan) itu jadi tes Anda bekerja lain kali.Memeriksa kode kesalahan (atau mengembalikan kode) setelah rm mencegah seseorang dengan mudah menggunakan kekuatan sudo untuk membuat file untuk memainkan lelucon pada Anda.
sumber
/root
(yang tidak harus sama dengan menjalankan sebagai UID 0), tetapi tidak memeriksa apakah proses tersebut menggunakan izin tersebutsudo
.Saya menemukan bahwa ini bekerja dengan baik untuk ini
sumber