Solusi 1:
Ya, ada 4 variabel lingkungan yang disetel saat program berjalan di bawah sudo:
$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20
Perhatikan bahwa ini dapat dipalsukan hanya dengan menyetelnya. Jangan percayai mereka untuk hal-hal penting.
Sebagai contoh:Dalam program ini kita perlu memberitahu pengguna untuk menjalankan beberapa program lain. Jika yang sekarang dijalankan dengan sudo, yang lain juga akan demikian.
#!/bin/bash
echo 'Thank you for running me.'
if [[ $(id -u) == 0 ]]; then
if [[ -z "$SUDO_COMMAND" ]]; then
echo 'Please now run: next_command'
else
echo 'Please now run: sudo next_command'
fi
else echo 'Error: Sadly you need to run me as root.'
exit 1
fi
Perhatikan bahwa ini hanya menguji variabel SUDO_* jika pertama kali dapat membuktikan bahwa itu berjalan sebagai root. Meski begitu, itu hanya menggunakannya untuk mengubah beberapa teks yang bermanfaat.
Solusi 2:
Ini tidak menjawab pertanyaan secara langsung tetapi menurut saya pertanyaan yang tepat tidak ditanyakan di sini. Tampaknya bagi saya penanya menginginkan sebuah program yang mungkin akan bertindak berbeda jika memiliki izin tertentu atau tidak, namun saya berpendapat memeriksa sudo bukanlah cara untuk melakukan itu. Pertama, banyak sistem mungkin tidak mengimplementasikan "sudo", ini sama sekali tidak diperlukan di Linux atau banyak Unix.
Misalnya seorang pengguna mungkin sudah masuk 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 malah menggunakan sistem kontrol akses wajib dengan kemampuan berbeda dan tidak menangkap semua pengguna super untuk sudo. Atau pengguna dapat disudo, tetapi ke akun yang memiliki -kurang- izin dari akun mereka sendiri untuk alasan keamanan (saya sering menjalankan kode yang tidak tepercaya dengan pengguna sementara yang tidak memiliki hak istimewa yang hanya dapat menulis ke ramdisk untuk menjatuhkan, bukan menaikkan izin saya ). Secara keseluruhan merupakan ide yang buruk untuk menganggap 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 hanya mencoba dan melakukannya kemudian periksa errno untuk masalah izin jika gagal atau jika itu adalah operasi multi tahap yang harus gagal atau semua berhasil Anda dapat memeriksa apakah suatu operasi akan berfungsi dengan fungsi seperti fungsi akses POSIX (waspadai kemungkinan kondisi balapan di sini jika izin diubah secara aktif)
Jika selain itu Anda perlu mengetahui pengguna sebenarnya di balik sudo, Anda dapat menggunakan fungsi getlogin yang seharusnya berfungsi untuk sesi interaktif apa pun dengan terminal yang mendasarinya dan akan memungkinkan Anda, misalnya, menemukan siapa yang 'benar-benar' menjalankan perintah untuk mengaudit atau menemukan direktori home dari pengguna sebenarnya untuk menyimpan log.
Terakhir, jika yang benar-benar Anda inginkan adalah mencari tahu apakah pengguna memiliki akses root (Masih merupakan ide yang buruk tetapi implementasinya kurang spesifik), Anda dapat menggunakan getuid untuk memeriksa uid 0 dan dengan demikian root.
Solusi 3:
Ada dua mekanisme yang bisa digunakan.
- Memeriksa variabel lingkungan dapat dipalsukan, tetapi paling mudah dilakukan.
growisofs
tidak suka berjalan di bawah SUDO, jadi saya menghapus variabel SUDO dalam skrip tempat saya menggunakannya. Itu bisa dipalsukan dengan cara lain. (Variabel SUDO juga dibawa ke lingkungan untuk skrip yang dijalankan di bawah perintah at dan batch.) - Cara lain untuk mengetahui apakah Anda menjalankan sudo adalah dengan menelusuri daftar proses dari proses induk Anda ke atas untuk mencari sudo. Akan sulit untuk menyembunyikan bahwa Anda menggunakan sudo dengan cara ini, tetapi ini lebih rumit. Masih mungkin untuk berpura-pura bahwa Anda menjalankan sudo.
Lebih umum untuk memeriksa apakah Anda menjalankan sebagai pengguna yang sesuai. id
perintah dapat digunakan untuk melakukan ini. Skrip TomOnTime menggunakan id
perintah untuk menentukan apakah sudo
mungkin diperlukan untuk menjalankan perintah berikutnya.
Solusi 4:
Anda dapat membandingkan ID pengguna yang efektif vs. yang asli.
Ini tidak sepenuhnya berarti 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 bersama mereka selama penginstalan atau untuk menginstal pembaruan. Kemudian, Anda dapat menggunakan ini untuk memberikan umpan balik peringatan tentang hal itu).
Solusi 5:
Anda dapat memeriksa variabel UID (EUID) yang efektif, sebagai berikut:
if [[ $EUID -eq 0 ]]; then
echo "running as root"
else
echo "not running as root"
fi