Saya menulis skrip (sebenarnya kombinasi skrip dan makefile) yang menginstal dependensi eksternal: beberapa apt-get
perintah, beberapa git
kloning, membangun, menginstal, menambahkan pengguna ke grup, ...
Beberapa operasi dalam skrip ini memerlukan izin pengguna super, beberapa tidak.
Sampai sekarang saya telah menjalankan seluruh proses make dengan sudo, tetapi memiliki beberapa kelemahan:
git
repo yang saya klon dapatkanroot
sebagai pemilik, yang berarti saya tidak dapat memodifikasinya sesudahnya tanpasudo
atauchown
- skrip yang menambahkan pengguna ke grup tidak tahu pengguna mana yang akan ditambahkan sejak
whoami
kembaliroot
Apa cara terbaik untuk menjalankan sebagai superuser hanya perintah yang membutuhkannya? Idealnya proses ini masih mengharuskan saya untuk memasukkan sudo
kata sandi, tetapi hanya sekali pada awal proses instalasi. Maka akan melupakannya di akhir, tetapi tetap sepanjang waktu sampai saat itu (bisa memakan waktu beberapa jam).
Solusi yang saya temukan online meliputi:
sudo -v
pada awal naskah, tetapi jika saya mengerti benar kali ini. Skrip saya dapat berjalan selama beberapa jam- menjalankan skrip dengan
sudo
, tetapi perintah yang tidak perlu superusersudo -u $(logname) <command>
. Inilah yang saya lakukan sekarang, tetapi rasanya harus sebaliknya.
Idealnya, saya ingin skrip saya untuk:
- meminta kredensial pengguna super
- jalankan perintah normal sebagai pengguna yang login
- jalankan perintah sudo dengan kredensial yang dimasukkan pada langkah 1
sudo -k
untuk menutup sesi pengguna super
SUDO_USER
variabel lingkungan. Jika ada, ini akan berisi nama pengguna pengguna yang meminta sudo. Jadi, Anda dapat (sebagai root) chown $ SUDO_USER: $ SUDO_GID $ your_files. Demikian pula, Anda dapat memeriksa variabel-variabel ini sehingga perintah adduser Anda tahu pengguna mana yang akan ditambahkan.su $SUDO_USER -c command
untuk perintah yang dijalankan sebagai pengguna normal.Jawaban:
Karena Anda memiliki akses sudo, buat sendiri file sudoers, lalu hapus ketika skrip selesai:
sumber
Salah satu cara, bahwa saya tidak akan umumnya merekomendasikan, adalah untuk membaca sandi sendiri, dan menggunakan
sudo
's-S
pilihan untuk melewati password sebagai dan bila diperlukan:Dari
man sudo
:sumber
echo "$password"
??echo "$password"
tidak akan, tetapi heredocs dan herestrings sedikit lebih aman. Mereka tidak terlihat di baris perintah yang ditunjukkan oleh alat yang biasa.echo "$password"
di sisi kiri dari pipa adalah aman di script bash.echo
adalah shell builtin;/bin/echo
tidak berjalan ketika itu disebut sederhanaecho ...
. Beberapa cangkang lain memilikiecho
builtin (dash
, misalnya), tetapi cangkang Bourne-style tidak diharuskan memilikinya. Jadi saya pikirecho "$password" |
ini dapat diterima di bash tetapi mungkin lebih baik dihindari jika seseorang port script ke shell lain tanpa memperhatikan masalah ini. Saya menggunakan non-portabel[[
alih - alih[
dalam skrip itu untuk menghindari masalah yang sama. @KasiyA