it-swarm-id.com

sudo echo "something" >> / etc / privilegedFile tidak berfungsi

Ini adalah pertanyaan yang cukup sederhana, setidaknya seperti seharusnya, tentang izin Sudo di Linux.

Ada banyak waktu ketika saya hanya ingin menambahkan sesuatu ke /etc/hosts atau file serupa tetapi akhirnya tidak bisa karena > dan >> keduanya tidak diperbolehkan, bahkan dengan root.

Apakah ada cara untuk membuat pekerjaan ini tanpa harus su atau Sudo su menjadi root?

529
David

Gunakan tee --append atau tee -a.

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list

Pastikan untuk menghindari kutipan di dalam tanda kutip.

Untuk menghindari pencetakan data kembali ke konsol, arahkan ulang output ke/dev/null.

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list > /dev/null
762
Yoo

Masalahnya adalah bahwa Shell melakukan redirection output, bukan Sudo atau echo, jadi ini dilakukan sebagai pengguna reguler Anda.

Coba cuplikan kode berikut:

Sudo sh -c "echo 'something' >> /etc/privilegedfile"
294
Matt P

Masalahnya adalah Shell Anda yang menangani pengalihan; itu mencoba membuka file dengan --- Anda bukan izin dari proses yang Anda jalankan di bawah Sudo.

Gunakan sesuatu seperti ini, mungkin:

Sudo sh -c "echo 'something' >> /etc/privilegedFile"
31
Incident
Sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
17
Vinko Vrsalovic

Perbuatan

Sudo sh -c "echo >> somefile"

harus bekerja. Masalahnya adalah bahwa> dan >> ditangani oleh Shell Anda, bukan oleh perintah "sudoed", jadi izinnya adalah izin Anda, bukan yang Anda gunakan untuk "sudoing".

13
agnul

Saya ingin mencatat, bagi yang penasaran, bahwa Anda juga dapat mengutip heredoc (untuk balok besar):

Sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf
<?xml version=\"1.0\" encoding=\"UTF-8\"?>

<plist version=\"1.0\">
  <dict>
    <key>Label</key>
    <string>com.company.ipfw</string>
    <key>Program</key>
    <string>/sbin/ipfw</string>
    <key>ProgramArguments</key>
    <array>
      <string>/sbin/ipfw</string>
      <string>-q</string>
      <string>/etc/ipfw.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true></true>
  </dict>
</plist>
EOIPFW"
9
msanford

Dalam bash Anda dapat menggunakan tee dalam kombinasi dengan > /dev/null untuk menjaga stdout tetap bersih.

 echo "# comment" |  Sudo tee -a /etc/hosts > /dev/null
8
Vytenis Bivainis

Menggunakan jawaban Yoo , letakkan ini di ~/.bashrc Anda:

sudoe() {
    [[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
    echo "$1" | Sudo tee --append "$2" > /dev/null
}

Sekarang Anda dapat menjalankan sudoe 'deb blah # blah' /etc/apt/sources.list


Edit:

Versi yang lebih lengkap yang memungkinkan Anda untuk memasukkan atau memasukkan input dari file dan menyertakan saklar -a untuk mematikan penambahan (yang diaktifkan secara default):

sudoe() {
  if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then
    shift &>/dev/null || local failed=1
  else
    local append="--append"
  fi

  while [[ $failed -ne 1 ]]; do
    if [[ -t 0 ]]; then
      text="$1"; shift &>/dev/null || break
    else
      text="$(cat <&0)"
    fi

    [[ -z "$1" ]] && break
    echo "$text" | Sudo tee $append "$1" >/dev/null; return $?
  done

  echo "Usage: $0 [-a|--no-append] [text] <file>"; return 1
}
4
hololeap

Anda juga dapat menggunakan sponge dari paket moreutils dan tidak perlu mengarahkan ulang output (mis., Tidak ada tee suara untuk disembunyikan):

echo 'Add this line' | Sudo sponge -a privfile
2

gema 'Hello World' | (Sudo tee -a /etc/apt/sources.list)

0
Sudev Shetty