Saya sedang menulis skrip yang memerlukan izin tingkat root, dan saya ingin membuatnya sehingga jika skrip tidak dijalankan sebagai root, itu hanya gema "Tolong jalankan sebagai root." dan keluar.
Inilah beberapa pseudocode untuk apa yang saya cari:
if (whoami != root)
then echo "Please run as root"
else (do stuff)
fi
exit
Bagaimana saya bisa melakukan yang terbaik (bersih dan aman)? Terima kasih!
Ah, hanya untuk memperjelas: bagian (melakukan hal-hal) akan melibatkan menjalankan perintah yang di-dan-dari mereka sendiri membutuhkan root. Jadi menjalankannya sebagai pengguna biasa hanya akan menghasilkan kesalahan. Ini hanya dimaksudkan untuk menjalankan skrip yang membutuhkan perintah root, tanpa menggunakan sudo di dalam skrip, saya hanya mencari beberapa gula sintaksis.
id -u
mengembalikan0
untuk root.Jawaban:
Variabel lingkungan $ EUID memegang UID pengguna saat ini. UID Root adalah 0. Gunakan sesuatu seperti ini di skrip Anda:
Catatan: Jika Anda mendapatkan
2: [: Illegal number:
centang apakah Anda memiliki#!/bin/sh
di bagian atas dan mengubahnya ke#!/bin/bash
.sumber
2: [: Illegal number:
peringatan sampai mengubahnya ke versi Sergio.then
berada pada baris yang sama dengan kondisi ...Dalam skrip bash, Anda memiliki beberapa cara untuk memeriksa apakah pengguna yang berjalan adalah root.
Sebagai peringatan , jangan periksa apakah pengguna root dengan menggunakan
root
nama pengguna. Tidak ada yang menjamin bahwa pengguna dengan ID 0 dipanggilroot
. Ini adalah konvensi yang sangat kuat yang diikuti secara luas tetapi siapa pun bisa mengganti nama superuser dengan nama lain.Saya pikir cara terbaik saat menggunakan bash adalah dengan menggunakan
$EUID
, dari halaman manual:Ini adalah cara yang lebih baik daripada
$UID
yang bisa diubah dan tidak mencerminkan pengguna nyata yang menjalankan skrip.Cara saya mendekati masalah semacam itu adalah dengan menyuntikkan
sudo
perintah saya ketika tidak dijalankan sebagai root. Berikut ini sebuah contoh:Dengan cara ini perintah saya dijalankan oleh root saat menggunakan superuser atau
sudo
ketika dijalankan oleh pengguna biasa.Jika skrip Anda selalu dijalankan oleh root, cukup setel hak-haknya (
0500
).sumber
printf $EUID
dengan atau tanpa sudo, saya mendapatkan kembali UID saya sendiri. Jika saya menggunakan,id -u
saya mendapatkan UID saya dan ketika saya memohon dengan sudo saya mendapatkan 0 kembali. Apakah saya melakukan sesuatu yang salah?sudo bash <<<'echo $EUID'
denganbash <<<'echo $EUID'
. Lebih lanjut tentang heredok seperti heredoc di tldp.org/LDP/abs/html/x17837.htmlBeberapa jawaban telah diberikan, tetapi tampaknya metode terbaik yang digunakan adalah:
id -u
Ini tampaknya lebih dapat diandalkan daripada metode lain, dan tampaknya itu mengembalikan id 0 bahkan jika skrip dijalankan
sudo
.sumber
atau
:)
sumber
sudo
saya cukup ketiksudo !!
dan itu berfungsi untuk saya, daripada menekan panah UP, pergi ke awal baris, dan menambahkansudo
dengan tangan. Tidak yakin apakah itu merupakan hal BASH atau SUDO atau lainnya, tetapi sebagian besar berfungsi sepanjang waktu.if [ "$(id -u)" -ne 0 ]; then echo 'Please run as root.' >&2; exit 1; fi
. Bersulang.Seperti @wrikken disebutkan dalam komentarnya,
id -u
adalah pemeriksaan root yang jauh lebih baik.Selain itu, dengan penggunaan yang benar
sudo
, Anda dapat meminta skrip memeriksa dan melihat apakah skrip berjalan sebagai root. Jika tidak, minta ingat kembali melaluisudo
dan kemudian jalankan dengan izin root.Bergantung pada apa yang dilakukan skrip, opsi lain mungkin untuk mengatur
sudo
entri untuk perintah khusus apa pun yang mungkin diperlukan skrip.sumber
$0
memiliki nama skrip yang berjalan. Ada beberapa contoh di sini yang mungkin dapat membantu Anda.Ada pemeriksaan sederhana untuk pengguna menjadi root.
The
[[ stuff ]]
sintaks adalah cara standar menjalankan pemeriksaan di bash.Ini juga mengasumsikan bahwa Anda ingin keluar dengan 1 jika Anda gagal. The
error
fungsi beberapa bakat yang set keluaran teks ke merah (tidak diperlukan, tapi cukup berkelas jika Anda bertanya kepada saya).sumber
error
perintah itu? Sistem saya sepertinya tidak memilikinya. . .less
atau yang lainnya); dan (4) mengatur warna latar belakang, sehingga teks akan dapat dibaca terlepas dari warna latar belakang terminal pengguna. Jadi, kira-kira seperti itufunction error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; }
. (Tweak seperti yang diinginkan.)Cara yang sangat sederhana:
Manfaat menggunakan ini alih-alih
id
adalah Anda dapat memeriksa apakah pengguna non-root tertentu juga menjalankan perintah; misalnya.sumber
whoami
daripada menggunakanid
; yangwhoami
perintah juga dapat digunakan untuk memeriksa lain pengguna selain root, dengan nama.0- Baca dokumentasi resmi GNU Linux, ada banyak cara untuk melakukannya dengan benar.
1- pastikan Anda meletakkan tanda tangan shell untuk menghindari kesalahan dalam interpretasi:
2 - ini skrip saya
sumber
Dalam jawaban ini, biarkan itu menjadi jelas, saya kira pembaca dapat membaca
bash
dan POSIX shell scripts likedash
.Saya percaya tidak ada banyak yang bisa dijelaskan di sini karena jawaban yang dipilih dengan sangat baik menjelaskan banyak hal.
Namun, jika ada sesuatu untuk dijelaskan lebih lanjut, jangan ragu untuk berkomentar, saya akan melakukan yang terbaik untuk mengisi kekosongan ini.
Solusi serba optimal (tidak hanya ) untuk kinerja dan keandalan; semua kerang kompatibelbash
Solusi baru:
Benchmark (simpan ke file
is_user_root__benchmark
)Solusi asli:
^^^ Solusi striked-out terbukti tidak mempercepat, tetapi sudah ada sejak lama, jadi saya akan menyimpannya di sini selama saya melihat perlu.
Penjelasan
Karena banyak kali lebih cepat untuk membaca variabel
$EUID
standarbash
, nomor ID pengguna yang efektif, daripada menjalankanid -u
perintah untuk POSIX - hanya menemukan ID pengguna, solusi ini menggabungkan keduanya menjadi fungsi yang dikemas dengan baik. Jika, dan hanya jika,$EUID
karena alasan apa pun tidak tersedia,id -u
perintah akan dieksekusi, memastikan kami mendapatkan nilai pengembalian yang tepat, apa pun kondisinya .Mengapa saya memposting solusi ini setelah bertahun-tahun OP bertanya
Nah, jika saya melihat dengan benar, sepertinya ada kode yang hilang di atas.
Soalnya, ada banyak variabel yang harus diperhitungkan, dan salah satunya adalah menggabungkan kinerja dan keandalan .
Solusi POSIX portabel + Contoh penggunaan fungsi di atas
Kesimpulan
Sebanyak mungkin Anda tidak menyukainya, lingkungan Unix / Linux telah sangat beragam. Berarti ada orang yang
bash
sangat menyukai, mereka bahkan tidak memikirkan portabilitas ( cangkang POSIX ). Orang lain seperti saya lebih suka kerang POSIX . Sekarang ini masalah pilihan dan kebutuhan pribadi.sumber
Jika skrip benar-benar membutuhkan akses root maka izin file-nya harus mencerminkan itu. Memiliki skrip root yang dapat dieksekusi oleh pengguna non-root akan menjadi bendera merah. Saya mendorong Anda untuk tidak mengontrol akses dengan
if
cek.sumber
777
bom membuat pemeriksaan ini sedikit salah untuk jenis pengguna yang akan melakukan kesalahan di tempat pertama.bash /path/to/script
masih dapat dijalankan meskipuno=r
Salah satu cara sederhana untuk membuat skrip hanya dapat dijalankan oleh root adalah memulai skrip dengan baris:
#!/bin/su root
sumber
exit
? Dan masih jawaban-jawaban itu sedang dibesarkan? Saya kira orang secara implisit tidak ingin skrip dijalankan sebagai root. Jadi saya mengikuti cara berpikir itu, dengan jawaban yang lebih sederhana. Tapi ya, Anda juga bisa belajar dari jawaban yang lebih jelas di atascoba kode berikut:
ATAU
sumber
Sejauh yang saya tahu cara yang benar untuk memeriksanya adalah:
Lihat bagian "Menguji Root" di sini:
http://linuxcommand.org/lc3_wss0080.php
sumber
= "0"
dengan-eq 0
id -u
jauh lebih baik daripadawhoami
, karena beberapa sistem seperti android mungkin tidak menyediakan kata root.Contoh:
sumber
Catatan editor: Jika Anda tidak membutuhkan tanda kurung ganda, gunakan tanda kurung tunggal untuk portabilitas kode.
sumber
Periksa apakah Anda root dan berhenti jika Anda tidak:
Atau dalam contoh ini, cobalah untuk membuat direktori di lokasi root lalu coba setelah hak ditingkatkan.
Periksa apakah Anda root dan jika tidak meningkat jika memungkinkan:
sumber
Periksa root:
Diuji dan berjalan di root.
sumber