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?



@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

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

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.


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


[ "$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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.