Saya mencoba membuat skrip seperti ini:
#!/bin/bash
sudo -s
something...
Ketika saya mengeksekusinya, saya mendapatkan shell baru tetapi something
dieksekusi hanya ketika saya keluar dari shell yang dibuat oleh sudo -s
, bukan di dalamnya.
Ada bantuan?
shell-script
sudo
Matteo
sumber
sumber
sudo -s
kalau-kalauroot
pengguna memiliki (agak miskin) ide untuk mengganti cangkangnya. Ini harus benar-benarsudo sh
menyatakan secara eksplisit shell mana yang akan digunakan.Cara lain adalah dengan memberikan perintah bash penuh ke
sudo
:Namun, cara yang lebih baik akan meluncurkan skrip dengan
sudo
sebaliknya. Ini bukan ide yang sangat bagus untuk adasudo
di dalam skrip. Jauh lebih baik untuk menjalankan seluruh skrip dengan root privilege (sudo script.sh
). Jika perlu, Anda bisa menggunakansudo
untuk menjatuhkan hak istimewa untuk perintah tertentu. Sebagai contoh:Menjalankan skrip di atas menghasilkan:
sumber
The Bourne shell memiliki
-c
bendera yang dapat Anda gunakan untuk melewati script sewenang-wenang untuk shell, sehingga Anda dapat menulis sesuatu sepertiNamun ini hanya berguna untuk perintah yang paling sederhana, karena sangat sulit untuk mengutip skrip dengan benar dan ketidaknyamanan ini bahkan lebih tinggi jika Anda mengirim perintah ke server jauh melalui ssh karena skrip argumen akan dianalisis dua kali, sekali di samping mengirimkan skrip dan sekali di sisi menjalankan skrip.
Jika
something
skrip yang rumit atau perlu dilewatkan melalui ssh line, adalah praktik umum untuk menulis fungsiprepare_something_script
yang tugasnya adalah menulis skrip 'sesuatu' di stdout . Dalam bentuknya yang paling sederhana, fungsi ini dapat menggunakan dokumen di sini untuk menghasilkan hasilnya:Script yang dihasilkan oleh
prepare_something_script
kemudian dapat dieksekusi secara lokal dengan hak istimewa yang diberikan oleh sudo sebagai berikut:Dalam skenario di mana skrip harus dijalankan dari jarak jauh dengan hak istimewa yang diberikan oleh sudo , biasanya untuk menyandikan skrip di basis 64 untuk menghindari mengarahkan input standar ssh , seperti ini:
Jika Anda menggunakan kode itu dalam suatu fungsi, jangan lupa untuk menandai variabel something64 sebagai lokal . Beberapa implementasi base64 menawarkan
-d
flag untuk di-decode, yang kurang didukung dengan baik dibandingkan--decode
varian verbose . Beberapa implementasi perlu menambahkan-w 0
perintah encoding untuk menghindari jeda baris palsu.sumber
Anda perlu menambahkan perintah di depan sudo -s, bukan di baris berikutnya.
sumber