Menggunakan sudo su untuk perintah?

15

Saya sedang berusaha mengembangkan keterampilan baris perintah saya tadi malam dan mengalami masalah di mana ketika saya menggunakan sudo, saya mendapat pesan kesalahan yang mengatakan 'izin ditolak'. Namun ketika saya menggunakan 'sudo su' dan menjadi root, perintah itu berhasil.

Mengapa sudo tidak berfungsi pada contoh pertama?

Dulu:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

Dari edisi Linux Bible 2010 di bagian pengaturan server LAMP.

wdypdx22
sumber
Jika Anda tidak memberi contoh, agak sulit untuk menyelesaikan masalahnya.
LassePoulsen
1
Pertimbangkan sudo -slagi sudo su.
Jeremy L

Jawaban:

18

<,> Dan >> digunakan untuk pengalihan input / output untuk perintah - yang merupakan fitur yang disediakan oleh shell (misalnya, bash). Jadi, jika Anda mengetik perintah seperti sudo cat > /var/www/info.phpmaka shell yang menerima ini sebagai input mencoba untuk membuka file /var/www/info.phpdan menyediakan file itu sebagai output standar untuk sudoperintah. The sudoperintah bahkan tidak menyadari apakah outputnya akan konsol atau diarahkan ke file, karena ini diasuh oleh shell yang memanggil itu.

Jika shell yang Anda ketikkan perintah Anda adalah shell login Anda atau shell lain yang berjalan di terminal dengan id pengguna Anda, maka ia memiliki hak istimewa yang sama dengan id pengguna Anda - bukan milik root.

Jadi dalam kasus Anda, sedangkan perintah cat dieksekusi sebagai root, penyalinan outputnya /var/www/info.phpdiupayakan oleh shell yang berjalan sebagai pengguna normal, yang, seperti yang diharapkan, gagal.

Solusi untuk situasi seperti itu adalah menggunakan teeperintah:

sudo tee /var/www/info.php

Itu akan memiliki efek yang dimaksudkan menempatkan semua teks yang dimasukkan di konsol hingga ^ D ke dalam file yang ditentukan sebagai parameter.

Salah satu efek samping yang mungkin tidak diinginkan adalah itu teejuga akan menggemakan output ke stdout, jadi setelah Anda mengetik setiap baris dan tekan enter teeakan menampilkan salinannya kembali. Untuk menghindari ini, Anda dapat menggunakan varian berikut.

sudo tee /var/www/info.php > /dev/null

Rincian tentang teedapat diperoleh melalui info teedi terminal.

koushik
sumber
2

sudo tidak berfungsi untuk perintah yang memerlukan izin untuk menulis file, seperti:

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

Itu menjelaskan di halaman manual sudo.

NightwishFan
sumber
4
Menyebutkan bahwa Anda dapat "sudo -i" atau "sudo -s" untuk mendapatkan prompt root akan membuat jawaban ini lebih baik!
Jorge Castro
Tidak ada pipa dalam contoh perintah; ada pengalihan. Juga, "kadang-kadang tidak berhasil" tampaknya menyampaikan perilaku tidak stabil oleh sudo. Sebagaimana dicatat dalam jawaban koushik, perilaku tersebut cukup dapat diprediksi, konsisten, dan "benar" untuk model izin unix.
msw
2

Masalahnya adalah bagian "> foo.txt" ditafsirkan dan dieksekusi oleh penerjemah perintah Anda (shell) jauh sebelum perintah sudo dijalankan. Perintah sudo tidak tahu bahwa Anda ingin mengarahkan outputnya ke file.

Interpreter perintah Anda tidak memiliki otoritas root (tetapi perintah sudo akhirnya akan nanti) sehingga tidak dapat mengarahkan output ke foo.txt.

Thorbjørn Ravn Andersen
sumber
1

Cara lain untuk menyelesaikan ini adalah memulai subkulit dengan sudo dan jalankan perintah itu dalam subkulit itu:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

di sini, perintah yang "memiliki sudo" adalah bash, dan apa pun yang dijalankan di dalamnya memiliki izin root.

$ 2c, * -pike

Commonpike
sumber