GNU/Linux >> Belajar Linux >  >> Linux

Jalankan Baris Perintah Dengan Satu Sudo?

Misalnya 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 perlu hak sudo, Bagaimana saya bisa mencapai perintah yang sama seperti pengguna biasa dengan hak sudo?

Saya mencoba

sudo echo "something" > /path/foobar

tapi itu tidak berhasil, karena sudo hanya dihitung untuk edit tetapi tidak untuk bagian kanan
dari >

Tentu, saya bisa menjadi root sebelumnya dengan sudo su atau gunakan tee sebagai gantinya:

echo "something" | sudo tee /path/foobar

Tetapi saya ingin menemukan solusi di mana saya dapat bekerja dengan baris terakhir sebagai pengganti melalui

sudo !!

Apakah tidak ada cara untuk "mendaur ulang" baris terakhir dan cukup tambahkan sudo di depan?

Jawaban yang Diterima:

Anda tidak bisa hanya menempelkan 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 itu

sudo bash -c !!

kecuali bahwa ini tidak berhasil, karena !! interpolasi teks dari perintah sebelumnya, karakter khusus dan semua. Anda perlu mengambil teks perintah sebagai string dan meneruskannya sebagai argumen ke sh . Untungnya, fc bash bawaan memungkinkan Anda melakukannya¹.

sudo bash -c "$(fc -ln -1)"

Atau bahkan, untuk memastikan untuk menjalankan versi bash yang sama yang sedang berjalan:

sudo "$BASH" -c "$(fc -ln -1)"

Perhatikan bahwa karena perintah dijalankan dalam proses shell yang terpisah, ia mewarisi variabel lingkungan (hanya yang sudo mempertahankan, pikiran), tetapi tidak shell variabel internal. Opsi shell (mis. kshglob ) dan setelan lainnya juga akan dimulai dari default.

Perintah² yang sama bekerja di zsh dan ksh, meskipun ATT ksh93 membutuhkan keduanya first dan last nomor yang akan diteruskan ke fc (yang juga berfungsi di bash, zsh dan pdksh/mksh):

sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"

Menggunakan $0 untuk menunjuk executable dari shell yang sedang berjalan hanya berfungsi jika shell dipanggil melalui $PATH dan $PATH tidak berubah, atau melalui jalur absolut.

Inilah metode lain di zsh yang sedikit lebih jelas tetapi lebih lama:

sudo zsh -c $history[$[HISTCMD-1]]

Kata peringatan terakhir:sudo adalah untuk perintah yang berpotensi berbahaya. Jangan terlalu mudah menggunakannya!

Terkait:Bisakah sed mengganti karakter baris baru?

Ada beberapa spasi ekstra di awal dan substitusi perintah menghapus baris baru di akhir, tetapi sintaks shell tidak peduli tentang itu.
² Saya tidak berpikir zsh atau ksh memiliki sesuatu seperti $BASH bash; $0 hanya berfungsi ketika itu adalah jalur absolut, atau saat tidak mengandung garis miring dan jalur pencarian perintah tidak berubah.
fc adalah alias untuk hist di ATT ksh tapi itu sama baiknya.


Linux
  1. Jalankan menggabungkan beberapa perintah Linux dalam satu baris

  2. Bagaimana cara menjalankan perintah bash dengan hak sudo di Jawa?

  3. Jalankan skrip shell di shell saat ini dengan izin sudo

  1. Ekspansi penyangga:jalankan beberapa perintah alih-alih memperluas pada satu baris?

  2. ganti baris dalam satu file dengan baris lain dengan nomor baris

  3. sudo tidak bekerja pada perintah tertentu

  1. Jalankan Perintah Nohup Dengan Input?

  2. Bagaimana Memetakan Satu Perintah Vim Untuk Menjalankan Perintah Bash Berdasarkan Os?

  3. Bagaimana saya bisa menjalankan serangkaian perintah dalam subkulit bash sebagai pengguna lain menggunakan sudo?