Sebagai contoh jika saya ingin membuat file dan memasukkan teks dalam satu baris saya dapat mengarahkan output ke file dengan menggunakan >
operator:
echo "something" > /path/foobar
tetapi jika saya tidak memiliki akses ke folder /path/
dan memerlukan sudo hak istimewa, Bagaimana saya bisa mencapai perintah yang sama ini sebagai pengguna normal dengan hak sudo?
Saya mencoba
sudo echo "something" > /path/foobar
tapi itu tidak bekerja, karena sudo hanya jumlah untuk edit
tetapi tidak untuk bagian kanan
dari>
Tentu, saya bisa menjadi root sebelum dengan sudo su
atau menggunakan tee
:
echo "something" | sudo tee /path/foobar
Tetapi saya ingin mencari solusi di mana saya dapat bekerja dengan baris terakhir sebagai pengganti via
sudo !!
Apakah tidak ada cara untuk "mendaur ulang" baris terakhir dan tambahkan saja sudo
di depan?
bash
sudo
command-history
rubo77
sumber
sumber
alias sudo !!
?Jawaban:
Anda tidak bisa hanya tetap
sudo
di depan perintah shell, Anda harus memanggil shell untuk mengevaluasi perintah itu lagi (melakukan hal-hal seperti memperluas variabel, membuka file untuk operator pengalihan, dll.). Jadi begitukecuali bahwa ini tidak cukup berhasil, karena
!!
menyisipkan teks dari perintah sebelumnya, karakter khusus dan semua Anda perlu mengambil teks perintah sebagai string dan meneruskannya sebagai argumensh
. Untungnya,fc
built - in bash memungkinkan Anda melakukan itu¹.Atau bahkan, untuk memastikan untuk menggunakan versi bash yang sama yang sedang berjalan:
Perhatikan bahwa karena perintah dieksekusi dalam proses shell terpisah, itu mewarisi variabel lingkungan (hanya yang
sudo
mempertahankan, pikiran), tetapi tidak shell variabel internal. Opsi shell (mis.kshglob
) Dan pengaturan lain akan mulai dari default juga.Perintah yang sama² bekerja di zsh dan ksh, meskipun ATT ksh93 membutuhkan keduanya
first
danlast
nomor untuk diteruskan kefc
³ (yang juga bekerja di bash, zsh dan pdksh / mksh):Menggunakan
$0
untuk menunjuk executable dari running shell hanya berfungsi jika shell dipanggil melalui $ PATH dan $ PATH belum berubah, atau melalui path absolut.Berikut metode lain dalam zsh yang sedikit lebih jelas tetapi lebih lama:
Kata terakhir dari peringatan:
sudo
adalah untuk perintah yang berpotensi berbahaya. Jangan membuatnya terlalu mudah untuk digunakan!¹ Ada beberapa spasi putih di awal dan substitusi perintah menghilangkan baris baru di akhir, tetapi sintaksis shell tidak peduli tentang itu.
² Saya tidak berpikir zsh atau ksh memiliki sesuatu seperti bash
$BASH
;$0
hanya berfungsi saat ini merupakan path absolut, atau ketika tidak mengandung garis miring dan jalur pencarian perintah belum berubah.³ adalah alias untuk di ATT ksh tapi itu sama baiknya.
fc
hist
sumber
Jika Anda ingin mengulang perintah yang sama dengan sudo !! setelah melakukan perintah seperti ini:
Anda menggunakan sintaks ganti global untuk mengingat perintah:
Gunakan spasi setelah parameter -a .
Ini setara dengan sudo !! tetapi membantu Anda melewati batasan sudo untuk <dan>. Karena sudo tidak memungkinkan Anda untuk menggunakan [<,>].
Untuk memotong batasan sudo secara umum untuk pengalihan Anda dapat menggunakannya seperti ini:
perintah tee akan memungkinkan Anda untuk membaca dari input standar dan menulis ke output dan file standar
Jika Anda ingin mengulangi perintah dan menambahkan teks ke file, perintah tee memiliki opsi -a untuk menambahkan. Jadi Anda bisa mengingat perintah dengan
dan teks akan ditambahkan dalam file
contoh:
sumber
-a
benar - benar dibutuhkan?>
akan menimpa file,tee -a
akan menambahkan, yang akan>>
Tampaknya sesederhana
sudo sh -c "!!"
:sumber
echo "foo bar"
manash -c "echo "foo bar""
yang akan dicetak danfoo
bukanfoo bar
.sudo sh -c '!!'
malah mencoba jika perintah Anda tetapi itu tidak berhasil baika=b
dan kemudianecho "$a" >file
dan kemudiansudo sh -c '!!'
itu akan berkembang kesudo sh -c 'echo $a >file'
yang akan mencetak baris kosong, bukanb
kefile
.sudo
untuk mendapatkan shell root dan kemudian menyalin dan menempelkan perintah ke dalamnya akan paling dekat, tetapi gagal jika perintah itu diharapkan untuk menggunakan variabel yang ditetapkan di shell non-root Anda. Menggunakansudo sh -c "!!"
berfungsi dengan baik untuk perintah sederhana, tetapi penuh untuk yang kompleks. Saya pikir saran terbaik adalah jangan berharap bahwa ada beberapa perintah yang akan bekerja 100% setiap waktu - pelajari beberapa solusi yang mungkin dan terapkan masing-masing ketika itu paling cocok.