Meminta kata sandi sudo dan secara program meningkatkan hak istimewa dalam skrip bash?

49

Saat ini saya sedang mengerjakan skrip bash yang menginstal dan mengatur berbagai program pada sistem Linux persediaan (saat ini, Ubuntu). Karena menginstal program dan menyalin sejumlah file ke berbagai folder yang memerlukan hak-hak tinggi, saya sudah melakukan standar "Saya perlu hak-hak istimewa tinggi" -dan-keluar.

Namun, saya ingin, jika mungkin, dapat meminta pengguna untuk kata sandi sudo mereka dan meningkatkan hak istimewa skrip secara otomatis jika pengguna tidak menjalankan perintah skrip dengan sudo (seperti meluncurkannya dari file manager GUI), tanpa pengguna harus memulai ulang skrip.

Karena ini dirancang untuk berjalan pada instalasi Linux biasa, opsi apa pun yang memodifikasi sistem tidak akan berfungsi untuk tujuan saya. Semua opsi perlu dimasukkan ke skrip itu sendiri.

Apakah ini mungkin di dalam Bash? Jika demikian, apa cara terbaik (aman, namun ringkas) untuk melakukan ini?

Shauna
sumber
@MichaelMrozek - Ah, kegembiraan memiliki begitu banyak situs niche sambil mencoba meminimalkan fragmentasi. Dan Anda tahu, tautan yang Anda berikan tidak pernah muncul untuk saya saat mencari di Google.
Shauna
@jww Anda menyadari bahwa hampir semua tautan itu ditanyakan sekitar 4 tahun setelah ini, bukan?
Shauna
1
@Shauna - Saya kira Anda sudah memecahkan masalah sekarang. Tautan untuk pengunjung masa depan.

Jawaban:

64

Saya menjalankan sudolangsung dari skrip:

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi
Michael Mrozek
sumber
16

Saya menyarankan:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done
enzotib
sumber
Untuk apa if [[ -t 1 ]];memeriksa?
Shauna
Ah, baiklah. Saya pikir itu ada hubungannya dengan terminal vs GUI, tetapi tidak yakin apa pernyataan if itu sendiri sedang memeriksa.
Shauna
Luar biasa, terima kasih!
Fire-Dragon-DoL
16

Tambahkan ini sebagai baris pertama skrip:

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

Ubah sudoke gksuatau gksudojika Anda lebih suka prompt grafis.

Kevin
sumber
3
Catatan yang "$*"akan menggabungkan semua argumen menjadi satu ( /path/to/script one two threeakan menghasilkan $1menjadi one two three), dan $*tanpa tanda kutip akan mengacaukan spasi dalam argumen. "$@"berfungsi dengan benar
Michael Mrozek
@MichaelMrozek Ah, benar. Itu yang saya cari, Fixed
Kevin
Apakah ada cara untuk melakukan ini pada Debian, di mana sepertinya tidak ada perintah sudo?
nama pengguna salah
@rongusername menginstal sudo, jauh lebih baik daripada menggunakan su. Tetapi jika Anda benar-benar ingin, mungkinexec su -c "$0" "$@"
Kevin
2

contoh skrip saya tidak bisa berbagi ::

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK

IMPerial TeK. Solusi
sumber
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- Sepertinya liner yang benar-benar efisien! Bagus!
groovenectar
Apakah masuk akal untuk menggunakan UID Efektif di sini $EUDI,, atau selalu hasil yang sama? Misalnya,[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
groovenectar