Bash Scripting: Memerlukan skrip untuk dijalankan sebagai root (atau dengan sudo)

26

Saya mencoba menulis skrip bash (di Ubuntu) yang akan mencadangkan direktori menggunakan tar.

Bagaimana saya bisa melakukan pemeriksaan di skrip sehingga hanya bisa dijalankan sebagai root (atau dengan sudo)?

Misalnya, jika pengguna menjalankan skrip, itu harus mengatakan bahwa skrip ini harus dijalankan dengan hak akses sudo, dan kemudian berhenti. Jika skrip dieksekusi sebagai root, skrip akan terus melewati pemeriksaan.

Saya tahu harus ada solusi yang mudah, saya hanya belum bisa menemukannya dengan googling.

Cory Plastek
sumber

Jawaban:

37

Untuk menarik uid efektif gunakan perintah ini:

id -u

Jika hasilnya '0' maka skrip berjalan sebagai root, atau menggunakan sudo. Anda dapat menjalankan pemeriksaan dengan melakukan sesuatu seperti:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi
Scott Pack
sumber
5
Saya akan merekomendasikan sepenuhnya jalur kualifikasi ke id (mis., / Usr / bin / id). Jika tidak, pengguna yang licik dapat menulis skrip / biner mereka sendiri yang selalu mengembalikan 0 dan kemudian meletakkannya di lokasi yang ada sebelumnya di jalur pengguna yang mengeksekusi.
ktower
Sepakat. Memperbaiki dengan edit.
Scott Pack
6
Siapa pun yang 'licik' mencoba menjalankan skrip tidak akan dihentikan oleh Anda menggunakan path lengkap ke id.
theotherreceive
Saya setuju dengan yang lain ... ini skrip bash. Memenuhi syarat 'id' bin tidak akan menghentikan siapa pun yang serius ingin menyelesaikan cek. Lebih baik membiarkannya tidak memenuhi syarat untuk portabilitas.
Chris
1
Ini tidak memenuhi persyaratan "sudo".
GregB
17

Saya berasumsi Anda tahu bahwa dengan mengubah kepemilikan menjadi root

chown root:root file

dan mengatur izin ke 700

chmod 700 file

Anda akan mencapai hal yang sama - tanpa saran untuk dijalankan sebagai sudo.

Tetapi saya akan memposting jawaban ini untuk kelengkapan.

Brent
sumber
3
Ini adalah solusi yang lebih tepat daripada jawaban yang diterima. - My $ 0,02
Chris
Catatan: memeriksa skrip ke git menjadi lebih sulit. Untuk memperbaikinya,sudo git add <file>
Chaim Eliyah
2

Apa tujuan Anda di sini, untuk memberi tahu pengguna bahwa mereka harus menjalankan skrip sebagai root atau sebagai semacam tindakan pencegahan keamanan?

Jika Anda hanya ingin memberi tahu pengguna daripada saran uid apa pun baik-baik saja, tetapi saran itu sama bermanfaatnya dengan ban pada kuda sebagai tindakan pencegahan keamanan - tidak ada yang menghentikan pengguna menyalin naskah, mengeluarkan pernyataan if, dan tetap menjalankannya.

Jika ini adalah masalah keamanan maka skrip harus disetel ke 700, dimiliki oleh root: root, sehingga tidak dapat dibaca atau dieksekusi oleh pengguna lain.

theecereceive
sumber
Atau, bisa jadi skrip ini membutuhkan akses ke file atau perintah yang hanya dapat diakses untuk melakukan rooting agar dapat melakukan tugasnya, seperti dalam kasus saya
chrisbunney
2

Anda dapat menggunakan perintah whoami juga.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi
Kiril
sumber
Sebenarnya uid 0 adalah akun pengguna khusus dengan hak istimewa penuh. "root" hanyalah label / nama paling umum yang dipetakan ke UID itu. Tidak harus menjadi 'root' dan penyerang mungkin mencoba untuk mengeksploitasi ini.
0xSheepdog
2

Variabel bash $EUIDmenunjukkan UID efektif tempat skrip berjalan, jika Anda ingin memastikan skrip berjalan sebagai root, periksa apakah $EUIDmengandung nilai 0 atau tidak:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

Ini lebih baik daripada solusi dengan /usr/bin/id(untuk skrip bash!) Karena tidak memerlukan perintah eksternal.

neuhaus
sumber
1
Alih-alih hanya keluar, bisa meminta pengguna untuk masuk dengan mengubah sudo echodengan sudo "$0" "$@", dan mengganti exit 2dengan exit $?.
schumacher574
Ide bagus. Namun pertanyaannya meminta skrip yang berhenti, tidak berlari sudo dengan sendirinya.
neuhaus
0

Salah satu cara sederhana untuk membuat skrip hanya dapat dijalankan oleh root adalah memulai skrip dengan baris:
#!/bin/su root

alexandre1985
sumber
-1

"#! / bin / su root" memungkinkan pengguna dalam mode pengguna super untuk menjalankan skrip tanpa menggunakan kata sandi root. Jika Anda ingin pengguna super menjalankan skrip dengan hasil yang dari root, ini yang melakukannya.

Lynnux
sumber