Inilah sumber saya:
#!/bin/bash
echo "Running script to free general cached memory!"
echo "";
echo "Script must be run as root!";
echo "";
echo "Clearing swap!";
swapoff -a && swapon -a;
echo "";
echo "Clear inodes and page file!";
echo 1 > /proc/sys/vm/drop_caches;
echo "";
Itu membersihkan cache dan semacamnya, dan itu menggemakan bahwa itu perlu dijalankan sebagai root di terminal. Saya pada dasarnya hanya ingin skrip berhenti berjalan jika mendeteksi itu tidak dieksekusi sebagai root.
Contoh:
"Running script to free general cached memory!"
"Warning: script must be run as root or with elevated privileges!"
"Error: script not running as root or with sudo! Exiting..."
Jika dijalankan dengan privilege yang ditinggikan, itu hanya berjalan seperti biasa. Ada ide? Terima kasih!
shell-script
root
M. Knepper
sumber
sumber
root
dengan awalan awalan semua perintah yang harus dijalankanroot
bersamasudo
.Jawaban:
Pengguna root memiliki UID 0 (terlepas dari nama akun "root"). Jika UID efektif dikembalikan oleh
id -u
tidak nol, pengguna tidak menjalankan script dengan hak akses root. Gunakanid -ru
untuk menguji terhadap ID asli (UID pengguna yang menggunakan skrip).Jangan gunakan
$EUID
dalam skrip karena ini dapat dimodifikasi oleh pengguna yang tidak memiliki hak pribadi:Jika pengguna melakukan ini, itu jelas tidak akan mengarah pada peningkatan hak istimewa, tetapi dapat menyebabkan perintah dalam skrip tidak dapat melakukan apa yang seharusnya mereka lakukan dan file dibuat dengan pemilik yang salah dll.
sumber
/bin/id -u
memberi/bin/id: illegal option -- u
Usage: id [-ap] [user]
/usr/xpg4/bin
lebih awal$PATH
untuk mendapatkan akses ke utilitas POSIX di Solaris.-u
opsiid
tidak universal dan oleh karena itu solusi ini bersifat universal hanya dengan peringatan bahwa versi POSIXid
harus muncul terlebih dahulu di PATH Anda.$PATH
di bagian atas skrip sehingga/usr/xpg4/bin
sebelumnya/bin
. Jika Anda bersikeras menggunakan non-POSIXid
, maka jelas Anda harus datang dengan solusi yang lebih portabel.PATH=$( getconf PATH )
atau mengatur beberapa jalur default eksplisit lainnya, atau menggunakan jalur eksplisit untuk memanggilid
.Saya pikir yang Anda inginkan adalah untuk memastikan bahwa Anda memiliki hak pengguna super, yaitu id pengguna efektif Anda adalah 0.
zsh
danbash
membuatnya tersedia dalam$EUID
variabel, sehingga Anda dapat melakukan:Dengan setiap kerang mirip POSIX, Anda dapat menggunakan
id
perintah standar:Perhatikan bahwa semua
id -un
atauwhoami
atau$USERNAME
variabel dalamzsh
akan memberi Anda nama pengguna pertama untuk uid. Pada sistem yang memiliki pengguna lain dengan id 0, itu mungkin tidakroot
bahkan jika prosesnya adalah keturunan dari yang telah diautentikasiroot
.$USER
biasanya akan memberi Anda pengguna yang diautentikasi, tetapi mengandalkannya cukup rapuh. Itu tidak diatur oleh shell, tetapi biasanya diatur oleh perintah otentikasi (sepertilogin
,su
(pada sistem GNU / Linux, belum tentu yang lain)sudo
,,sshd
(yang dari openssh setidaknya) ...). Namun tidak selalu (mengubah uid tidak secara otomatis mengatur variabel itu, itu harus dilakukan secara eksplisit oleh aplikasi mengubah uid) dan itu bisa juga telah dimodifikasi oleh beberapa proses lain dalam keturunan shell.$LOGNAME
, dengan peringatan yang sama lebih dapat diandalkan karena ditentukan oleh POSIX (berasal dari FIPS 151-2)sumber
Anda dapat menggunakan
$USER
atauwhoami
untuk memeriksa pengguna saat ini.sumber
3.2.4.2 Conditional Constructs
3.5.4 Command Substitution
id -u
dengan atau tanpa-n
opsi adalah alternatif untuk menggunakan whoami. Tanpa -n dan membandingkan ke nol adalah kecocokan yang lebih baik dengan tes yang sebenarnya dilakukan kernel. Semua kernel peduli adalah id, bukan nama dari file kata sandi.$(id -u)
lebih baik. Dalam beberapa kasus (jahat),$USER
bisa saja salah.Apa yang sebenarnya Anda inginkan adalah menentukan apakah Anda memiliki akses untuk melakukan operasi ini. Ini dianggap praktik buruk untuk memeriksa apakah Anda root atau tidak sebagai pengganti itu.
Jika sistem telah dikonfigurasi untuk memungkinkan pengguna non-root untuk memodifikasi swap dan drop cache halaman, mengapa pengguna itu tidak boleh menjalankan skrip Anda?
Sebagai gantinya, Anda bisa mencoba operasi dan keluar dengan pesan bermanfaat jika gagal:
sumber
exit
setelah sesuatu gagal, jika pengguna ingin melakukan sebanyak yang mereka bisa dengan hak istimewa mereka saat ini. (Tetapi untuk sistem tipikal di mana semua ini membutuhkan root, keluar akan lebih bermanfaat / kurang berisik.)