Saya sedang menulis skrip bash yang sederhana, tetapi saya membutuhkannya untuk memeriksa apakah skrip tersebut dijalankan sebagai root atau tidak. Saya tahu mungkin ada cara yang sangat sederhana untuk melakukan itu, tetapi saya tidak tahu caranya.
Untuk lebih jelasnya:
Apa cara sederhana untuk menulis skrip foo.sh , sehingga perintah ./foo.sh
menghasilkan 0
, dan perintah sudo ./foo.sh
menghasilkan 1
?
$UID
dan$EUID
merupakan bashism. Hanya shell yang mematuhi POSIX yang tidak memiliki variabel-variabel itu dan Anda harus menggunakannyaid(1)
.if ((EUID)); then
, lihat komentar @ geirhasudo
. Jika Anda menjalankan,sudo sh -c 'echo $EUID'
Anda akan melihat hasil yang Anda harapkan.$EUID
adalah Bashism (seperti yang disebutkan di atas oleh @DavidFoerster), dan/bin/sh
kemungkinan besar Anda memiliki tautan/bin/dash
, bukan/bin/bash
.sudo bash -c 'echo $EUID'
akan menghasilkan hasil yang diharapkan.Seorang pengguna root tidak harus dinamai "root".
whoami
mengembalikan nama pengguna pertama dengan ID pengguna0
.$USER
berisi nama pengguna yang masuk, yang dapat memiliki ID pengguna0
, tetapi memiliki nama yang berbeda.Satu-satunya program yang dapat diandalkan untuk memeriksa apakah akun tersebut login sebagai root, atau tidak:
Saya menggunakan
-u
untuk ID pengguna yang efektif , bukan-r
untuk ID pengguna yang sebenarnya . Izin ditentukan oleh ID pengguna yang efektif , bukan yang asli .Tes
/etc/passwd
berisi nama pengguna berikut dengan ID pengguna0
dalam urutan yang diberikan:Masuk sebagai
root2
, memberikan hasil selanjutnya:whoami
:rootx
echo $USER
:root2
(ini mengembalikan string kosong jika program dimulai di lingkungan kosong, mis.env -i sh -c 'echo $USER'
)id -u
:0
Seperti yang Anda lihat, program lain gagal dalam pemeriksaan ini, hanyaid -u
berlalu.Skrip yang diperbarui akan terlihat seperti ini:
sumber
id -u
di bash askubuntu.com/questions/30148/…sh
(dash
) sebagai penerjemah alih-alihbash
. Tapi tembakan yang bagus, simpan garpu lain :)[ -w / ]
,. Idenya tetap sama. Catatan: pada chroot tertentu,[ -w /etc/shadow ]
akan gagal karena/etc/shadow
tidak ada, oleh karena itu pendekatan dengan/
lebih disukai. Cara yang lebih baik akan memeriksa kebutuhan aktual untuk izin root. Jika skrip perlu ditulis/etc/someconfig
, cukup periksa apakah file itu dapat ditulisi ATAU file tersebut tidak ada dan/etc
dapat ditulisi.Seperti yang dikatakan @Lekensteyn, Anda harus menggunakan ID pengguna yang efektif. Anda tidak perlu memanggil
id -u
bash:Saran @ geirha dari komentar menggunakan evaluasi aritmatika:
sumber
((..))
untuk menguji angka, dan[[..]]
untuk menguji string dan file, jadi saya akan melakukanif (( EUID != 0 )); then
sebaliknya, atau hanyaif ((EUID)); then
EUID
harus menjadi$EUID
. Alih-alih menggunakan(( $EUID != 0 ))
, gunakan[ $EUID != 0 ]
. Ini juga akan bekerja dengan baikdash
.EUID
bekerja dengan baik. Pertanyaanbash
tidak ditandaidash
. Perintahenv -i sh -c '[ $EUID != 0 ]'
gagal, tetapienv -i bash -c '(( EUID != 0 ))'
berhasil. btw,dash
tidak berfungsi untuk beberapa karakter non-ascii di Ubuntu stackoverflow.com/questions/5160125/… Ini adalah 2011 dan ada orang yang menggunakan bahasa lain.$EUID
hal - hal dari titik ini ke depan. Saya telah mengubah jawaban yang diterima sebagai hasilnya.Anda dapat melakukannya dengan menggunakan
whoami
perintah, yang mengembalikan pengguna saat ini:Menjalankan di atas akan mencetak
You must be root to do this.
jika pengguna saat ini tidakroot
.Catatan: alternatif dalam beberapa kasus adalah dengan hanya memeriksa
$USER
variabel:sumber
$USER
, terutama dengan cara ini.$USER
diatur oleh shell login, tidak perlu disebarkan ke program (env -i sh -c 'echo $USER'
). Dengan cara itu,$USER
kosong dan terjadi kesalahan sintaksis.$USER
diatur oleh shell, itu juga sesuatu yang mudah dipalsukan. Whoami akan mengembalikan pengguna yang sebenarnya.$USER
ditafsirkan oleh shell Anda, contoh Anda harussudo sh -c 'echo $USER'
bermakna. @ George: itu membuat asumsi yang salah yangwhoami
akan selalu kembaliroot
untuk UID 0.Mempertimbangkan efisiensi, Anda dapat menguji, pertama,
EUID
variabel lingkungan dan kemudian, jika tidak ada, hubungiid
perintah standar :Dengan cara ini, karena pintasan OR , Anda menghindari memanggil perintah sistem, memprioritaskan kueri dari variabel di dalam memori.
Penggunaan kembali kode:
sumber
id -u
. Lihat skrip bench bersama dengan hasil di bawahnya di sini: pastebin.com/srC3LWQysumber
Salah satu cara sederhana untuk membuat skrip hanya dapat dijalankan oleh root adalah memulai skrip dengan baris:
#!/bin/su root
sumber
sumber
Cuplikan ini akan:
sudo !!
sumber
Jawaban ini hanya untuk menyimpan ide dengan semoga bermanfaat bagi sebagian dari Anda. Jika Anda memerlukan skrip yang dijalankan dari desktop GUI dan membutuhkan hak akses root, coba cara ini:
Dengan cara ini Anda akan mendapatkan jendela dialog yang bagus meminta Anda untuk kata sandi pengguna root. Sama seperti dengan sudo baris perintah.
The
gksudo
mungkin tidak tersedia di sistem anda kemudian menginstalnya dengansudo apt-get install gksu
.sumber
Kode ini bekerja di bawah Bash dan Bourne sh stock (diuji di bawah FreeBSD) yang tidak mendefinisikan EUID. Jika EUID ada, nilainya dikembalikan, jika tidak maka perintah 'id' dijalankan. Ini sedikit lebih pendek daripada contoh "atau" di atas, karena menggunakan shell bawaan ": -".
Root di sh:
sumber