getuid
atau geteuid
akan menjadi pilihan yang jelas.
getuid
memeriksa kredensial pengguna sebenarnya.
e
yang ditambahkan di geteuid
singkatan dari effective
. Ini memeriksa kredensial yang efektif.
Sebagai contoh saja, jika Anda menggunakan sudo
untuk menjalankan program sebagai root (pengguna super), kredensial Anda yang sebenarnya masih merupakan akun Anda sendiri, tetapi kredensial efektif Anda adalah akun root (atau anggota grup wheel, dll.)
Misalnya, pertimbangkan kode seperti ini:
#include <unistd.h>
#include <iostream>
int main() {
auto me = getuid();
auto myprivs = geteuid();
if (me == myprivs)
std::cout << "Running as self\n";
else
std::cout << "Running as somebody else\n";
}
Jika Anda menjalankan ini secara normal, getuid()
dan geteuid()
akan mengembalikan nilai yang sama, jadi akan tertulis "running as self". Jika Anda melakukan sudo ./a.out
sebagai gantinya, getuid()
masih akan mengembalikan ID pengguna Anda, tetapi geteuid()
akan mengembalikan kredensial untuk root atau wheel, sehingga akan tertulis "Berjalan sebagai orang lain".
Saya akan merekomendasikan BUKAN membuat perubahan ini, tetapi malah meningkatkan pesan kesalahan Anda. Diragukan bahwa aplikasi Anda benar-benar perlu "di-root"; alih-alih itu membutuhkan hak istimewa tertentu yang dimiliki root, tetapi sistem operasi mana dengan kontrol keamanan berbutir halus mungkin dapat memberikan ke aplikasi tanpa memberikannya akses root penuh. Bahkan jika itu tidak mungkin sekarang, itu mungkin 6 bulan atau 2 tahun dari sekarang, dan pengguna akan kesal jika program Anda menolak untuk berjalan berdasarkan asumsi mundur tentang model izin daripada hanya memeriksa apakah itu berhasil dalam kinerja. operasi istimewa yang diperlukan.
#include <unistd.h> // getuid
#include <stdio.h> // printf
int main()
{
if (getuid()) printf("%s", "You are not root!\n");
else printf("%s", "OK, you are root.\n");
return 0;
}