Meminta pengguna untuk masuk sebagai root saat menjalankan skrip shell

17

Masalah yang saya dapatkan adalah, ketika saya memasukkan perintah,

su - root

di awal file skrip shell saya, itu meminta pengguna untuk memasukkan kata sandi dan kemudian TIDAK melanjutkan dengan sisa skrip shell. Saya kemudian harus mencari dan menjalankan skrip shell secara manual melalui terminal. Saya ingin skrip untuk memastikan bahwa pengguna login sebagai root dan kemudian melanjutkan dengan sisa skrip shell.

Dengan kata lain, saya ingin menjalankan skrip sebagai pengguna mana pun, tetapi segera setelah skrip mulai dijalankan, pengguna harus mengubah ke root dan kemudian melanjutkan dengan sisa skrip sebagai root hingga selesai. Bisakah ini dilakukan?

Redson
sumber

Jawaban:

34

Ini sangat mudah dicapai:

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

Ketika pengguna saat ini tidak melakukan root, jalankan kembali skrip sudo.

Perhatikan bahwa saya menggunakan di sudosini bukan su. Ini karena memungkinkan Anda untuk mempertahankan argumen. Jika Anda menggunakan su, perintah Anda harus su -c "$0 $@"yang akan memotong-motong argumen Anda jika mereka memiliki spasi atau karakter shell khusus.

Jika shell Anda adalah bash, Anda dapat menghindari panggilan eksternal ke whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"
Patrick
sumber
Maaf, saya membuat kesalahan dalam penjelasan sehingga mungkin salah ditafsirkan. Berikut ini penjelasan yang lebih jelas. Terima kasih untuk bantuannya!
Redson
@ user68857 Pertanyaan Anda jelas. Jawaban ini sesuai dengan yang Anda inginkan.
Patrick
saya terus mendapatkan kesalahan ini: sudo: harus setuid root
Redson
saya ingin menjalankan skrip sebagai pengguna biasa melalui terminal tetapi skrip kemudian harus mengalihkan pengguna ke root sampai akhir skrip
Redson
@Nosscire jika Anda mendapatkan sudo: must be setuid root, maka sesuatu terjadi pada sudo Anda. Untuk memperbaikinya: chmod u+s $(which sudo). Dan ya, saya sangat menyadari apa yang Anda coba lakukan, saya melakukan hal yang sama sepanjang waktu dalam skrip saya.
Patrick
7

Anda dapat memeriksa UID juga:

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi
Sungai kecil
sumber
5

Anda dapat memanggil skrip itu sendiri dan memeriksa:

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...
Hauke ​​Laging
sumber
0

Pada titik di mana Anda ingin masuk, cukup tambahkan perintah berikut

sudo su

Ini berfungsi sempurna dengan kode saya

pengguna245333
sumber