Saya telah diberikan akses sudo pada salah satu kotak pengembangan RedHat linux kami, dan saya sepertinya mendapati diri saya cukup sering perlu mengarahkan ulang output ke lokasi yang saya biasanya tidak memiliki akses tulis.
Masalahnya adalah, contoh buatan ini tidak berfungsi:
sudo ls -hal /root/ > /root/test.out
Saya baru saja menerima tanggapan:
-bash: /root/test.out: Permission denied
Bagaimana saya bisa membuatnya bekerja?
root
(dalam hal ini lanjutkan membaca jawaban) tetapi sangat sering, Anda hanya perlu membuat file di tempat lain, seperti diri Anda sendiri.Jawaban:
Perintah Anda tidak berfungsi karena pengalihan dilakukan oleh shell Anda yang tidak memiliki izin untuk menulis
/root/test.out
. Pengalihan output tidak dilakukan oleh sudo.Ada beberapa solusi:
Jalankan shell dengan sudo dan berikan perintah padanya dengan menggunakan
-c
opsi:Buat skrip dengan perintah Anda dan jalankan skrip itu dengan sudo:
Lari
sudo ls.sh
. Lihat jawaban Steve Bennett jika Anda tidak ingin membuat file sementara.Luncurkan shell dengan
sudo -s
lalu jalankan perintah Anda:Gunakan
sudo tee
(jika Anda harus banyak melarikan diri saat menggunakan-c
opsi):Redirect ke
/dev/null
diperlukan untuk menghentikan tee agar tidak keluar ke layar. Untuk menambahkan alih-alih menimpa file output (>>
), gunakantee -a
atautee --append
(yang terakhir adalah khusus untuk GNU coreutils ).Terima kasih kepada Jd , Adam J. Forster dan Johnathan untuk solusi kedua, ketiga dan keempat.
sumber
perl -e 'print "STDIN\n"; print STDERR "STDERR\n"; ' > >( tee stdout.log ) 2> >( tee stderr.log >&2 )
Seseorang di sini baru saja menyarankan sudoing tee:
Ini juga dapat digunakan untuk mengarahkan ulang perintah apa pun, ke direktori yang Anda tidak memiliki akses. Ini bekerja karena program tee secara efektif merupakan program "gema ke file", dan redirect ke / dev / null adalah untuk menghentikannya juga menampilkan ke layar agar tetap sama seperti contoh asli yang dibuat di atas.
sumber
sudo
(yaitu, untuk perintah itu sendiri) mungkin dihilangkanTrik yang saya temukan sendiri adalah
sumber
sudo dd
lebih baik darisudo tee /root/file > /dev/null
contoh di atas!dd
adalah nama perintah,of=/root/test.out
adalah argumen yang memberi tahudd
apa File Output.of
berarti file output dandd
merupakan alat yang sangat populer digunakan di Linux dan OSX (kebanyakan untuk menulis gambar ke disk). Ini trik yang pasti.dd
mungkin sama bermanfaatnya seperti ditee
sini. Dalam kedua kasus Anda menggunakan perintah umum yang terkenal untuk tujuan yang, meskipun sedikit berbeda dengan tujuan semula, masih terkenal dan didokumentasikan dengan baik. Meskipundd
pandai menyalin data dalam jumlah besar, itu tidak payah dengan jumlah kecil. Ini memiliki manfaat di sini tidak menggema output ke output standar juga.sudo dd
samping satu sama lain, Anda ingin membuat sangat, sangat yakin bahwa argumen yang mengikuti sudah benar (terutama mengingat sintaksinya yang tidak standar). Mereka tidak menyebutnya "perusak disk" tanpaMasalahnya adalah bahwa perintah dijalankan di bawah
sudo
, tetapi pengalihan dijalankan di bawah pengguna Anda. Ini dilakukan oleh shell dan ada sangat sedikit yang dapat Anda lakukan.Cara biasa untuk melewati ini adalah:
Bungkus perintah dalam skrip yang Anda panggil dengan sudo.
Jika perintah dan / atau file log berubah, Anda dapat membuat skrip menganggapnya sebagai argumen. Sebagai contoh:
Panggil shell dan lulus baris perintah sebagai parameter dengan
-c
Ini sangat berguna untuk perintah gabungan. Sebagai contoh:
sumber
Variasi lain pada tema:
Atau tentu saja:
Mereka memiliki (kecil) keuntungan yang Anda tidak perlu mengingat argumen apapun untuk
sudo
ataush
/bash
sumber
Klarifikasi sedikit tentang mengapa opsi tee lebih disukai
Dengan asumsi Anda memiliki izin yang sesuai untuk mengeksekusi perintah yang menciptakan output, jika Anda mengirimkan output dari perintah Anda ke tee, Anda hanya perlu meninggikan hak istimewa tee dengan sudo dan tee langsung untuk menulis (atau menambahkan) ke file yang dimaksud.
dalam contoh yang diberikan dalam pertanyaan yang berarti:
untuk beberapa contoh yang lebih praktis:
Dalam setiap contoh ini, Anda mengambil output dari perintah yang tidak diistimewakan dan menulis ke file yang biasanya hanya dapat ditulis oleh root, yang merupakan asal dari pertanyaan Anda.
Ini adalah ide yang baik untuk melakukannya dengan cara ini karena perintah yang menghasilkan output tidak dieksekusi dengan privilege yang ditinggikan. Tampaknya tidak masalah di sini,
echo
tetapi ketika perintah sumber adalah sebuah skrip yang tidak Anda percayai sepenuhnya, itu penting.Catatan Anda dapat menggunakan opsi -a untuk tee untuk menambahkan append (suka
>>
) ke file target daripada menimpanya (seperti>
).sumber
Buat sudo run shell, seperti ini:
sumber
Cara saya membahas masalah ini adalah:
Jika Anda perlu menulis / mengganti file:
Jika Anda perlu menambahkan file:
sumber
Bagaimana dengan menulis naskah?
Nama file: myscript
Kemudian gunakan sudo untuk menjalankan skrip:
sumber
Setiap kali saya harus melakukan sesuatu seperti ini, saya menjadi root:
Ini mungkin bukan cara terbaik, tetapi berhasil.
sumber
Saya akan melakukannya dengan cara ini:
sumber
su
):$ sudo su -c 'pstree -sp $$ >/dev/fd/1'
init(1)───gnome-terminal(6880)───bash(6945)───sudo(401)───su(402)───bash(410)───pstree(411)
Tidak bermaksud untuk mengalahkan kuda mati, tetapi ada terlalu banyak jawaban di sini bahwa penggunaan
tee
, yang berarti Anda harus mengarahkanstdout
ke/dev/null
kecuali jika Anda ingin melihat salinan di layar.Solusi yang lebih sederhana adalah dengan menggunakan
cat
seperti ini:Perhatikan bagaimana pengalihan dimasukkan ke dalam tanda kutip sehingga dievaluasi oleh shell yang dimulai dengan
sudo
bukannya yang menjalankannya.sumber
sudo bash -c "ls -hal /root > /root/test.out"
. Menggunakan tee tidak memerlukan shell, sedangkan kucing tidak.Ini didasarkan pada jawaban yang melibatkan
tee
. Untuk mempermudah, saya menulis skrip kecil (saya menyebutnyasuwrite
) dan memasukkannya/usr/local/bin/
dengan+x
izin:Seperti yang ditunjukkan dalam USAGE dalam kode, yang harus Anda lakukan adalah menyalurkan output ke skrip ini diikuti oleh nama file yang dapat diakses oleh superuser yang diinginkan dan secara otomatis akan meminta kata sandi Anda jika diperlukan (karena sudah termasuk
sudo
).Perhatikan bahwa karena ini adalah pembungkus sederhana untuk
tee
, itu juga akan menerima-a
opsi tee untuk menambahkan, dan juga mendukung penulisan ke beberapa file pada saat yang sama.Ini juga memiliki beberapa perlindungan sederhana terhadap penulisan ke
/dev/
perangkat yang menjadi perhatian yang disebutkan dalam salah satu komentar di halaman ini.sumber
Mungkin Anda diberi akses sudo ke hanya beberapa program / jalur? Maka tidak ada cara untuk melakukan apa yang Anda inginkan. (kecuali Anda akan meretasnya entah bagaimana)
Jika bukan itu masalahnya, mungkin Anda bisa menulis skrip bash:
Tekan ctrl+ d:
Semoga ini bisa membantu.
sumber
sumber
sudo
,at
tidak berguna atau tidak perlu.sudo sh -c 'echo test >/tmp/test.out'
melakukan hal yang sama dengan jauh lebih efisien dan elegan (tetapi masih menderita cacat karena Anda mungkin menjalankan hal-halroot
yang tidak memerlukan hak istimewa itu; Anda biasanya harus menghindari perintah istimewa ketika Anda bisa).