sudo echo “bir şey” >> / etc / privilegedFile çalışmıyor


586

Bu oldukça basit bir soru, en azından öyle görünüyor ki, Linux'taki sudo izinleri hakkında.

Sadece ekleme bir şey istediğinizde bir çok kez vardır /etc/hostsya da benzer bir dosyaya ama hem çünkü mümkün olmayan sonunda >ve>> hatta root ile izin verilmez.

Bu işi yapmak zorunda kalmadan suveya sudo sukök salmadan yapmak için bir yol var mı ?

Yanıtlar:


855

tee --appendVeya tuşunu kullanın tee -a.

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

Tırnak içindeki tırnaklardan kaçının.

Verilerin konsola geri yazdırılmasını önlemek için, çıkışı / dev / null konumuna yönlendirin.

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

( -a/ --append) Bayrağını unutmayın! Sadece teegibi çalışır >ve dosyanızın üzerine yazar. tee -agibi çalışır >>ve dosyanın sonuna yazar.


3
Bunu kesinlikle tercih ederim. Bu sadece en basit (ve diğer senaryolarda da kullanışlı olan tee hakkında bana öğretti).
Joachim Sauer

5
Katılıyorum.
Sam

39
Dikkat edilmesi gereken önemli bir nokta: ASLA -a! Sadece ne echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstabyapacağını hayal et
mic_e

21
OS X altında tee -abunun yerine tee --append.
knite

26
@Mic_e'nin ne dediğini anlamayanlar için: ( ) bayrağı olmadan -akomut , sonuna sonuna eklemek yerine tüm dosyanın üzerine verilen dizeyle yazar . --append
totymedli

314

Sorun, kabuk sudo veya echo değil, yeniden yönlendirme çıktı, bu yüzden bu normal kullanıcı olarak yapılıyor.

Aşağıdaki kod snippet'ini deneyin:

sudo sh -c "echo 'something' >> /etc/privilegedfile"

"Sudo izin sınırları" nedir? Sadece yönlendirme operatörünü bariz nedenlerden ötürü bir komuttan daha yüksek önceliğe sahip olan kabuk
Vinko Vrsalovic

1
Senin bağlı sh, yankı gibi çıkış sıralarını yorumlayabilir \tiç tek tırnak. Bunun printf %s 'something'yerine kullanabilirsiniz .
Lri

Tee kullanmak daha popüler ve daha yeni dağıtımlarla daha uyumlu.
Eduardo

1
Bu, uzak bir düğümde çalıştırılabilen bir SSH komutu olarak olduğu gibi çalışan tek şeydir.
Duncan Lock

Buradaki diğer gönderilere katılıyorum. Bu bir kabuk ve sadece kabuk kullanır, bu nedenle burada tee gibi başka bir programa gerek yoktur. Evet tişörtün zaten kurulu olduğunu biliyorum, ama çıplak kemik gibi alpin gibi hangi mikro distro kullandığınıza bağlı olmayabilir. Ben de bir kabuk seçeneği var gibi: sudo /bin/bash -c "echo 'fs.inotify.max_user_watches = 524288' > /etc/sysctl.d/60-golang-inotify.conf"örneğin.
Ligemer

35

Sorun şu ki, yeniden yönlendirmeyi işleyen sizin kabuğunuz; o dosyayı açmaya çalışıyor senin sen sudo altında yayınladığınız sürecin bu izinleri değil.

Bunun gibi bir şey kullanın, belki:

sudo sh -c "echo 'something' >> /etc/privilegedFile"

@GordonSun bunun nedeni sudo(güvenlik nedeniyle) ortamı alt işleme yaymamasıdır . sudo -EBu kısıtlamayı atlamak için kullanabilirsiniz .
arielf

1
@GordonSun evet olacak, neden bu ifadeyi tekrarlamaya devam ettiğinizi anlamıyorum! Bunu yaparsanız sudo sh -c "echo 'something' >> $FILENAME", çift tırnak işaretleri ile bu işe yarayacaktır - değişken ikame, dış kabuk tarafından değil, dış kabuk tarafından yapılır.
Nadav Har'El


13

sudo sh -c "echo >> somefile"

çalışmalı. Sorun şudur:> ve >>, "sudoed" komutu tarafından değil, kabuğunuz tarafından işlenir; bu nedenle izinler, sizin "sudoing" yaptığınız kullanıcının değil, sizinkilerdir.


9

Meraklı için, bir heredoc (büyük bloklar için) de teklif edebileceğinizi not ediyorum:

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"

1
Bu \ ile kaçan gerekebilir gömülü tırnak hariç inşaat büyük
N Jones'a

Oldukça doğru @NJones! Cevabımı düzenleyeceğim. (Bununla birlikte, bunu yapmamanın dahili şeritleri değiştirdiğini "ancak komutun başarısız olmasına neden olmadığını unutmayın.)
msanford

8

Bash kullanabilirsiniz teebirlikte > /dev/nullstdout'u temiz tutmak.

 echo "# comment" |  sudo tee -a /etc/hosts > /dev/null

4

Yoo'nun cevabını kullanarak bunu aşağıdakilere ekleyin ~/.bashrc:

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

Şimdi koşabilirsin sudoe 'deb blah # blah' /etc/apt/sources.list


Düzenle:

Bir dosyaya giriş yapmanıza veya bir dosyadan yönlendirmenize olanak tanıyan ve -aeki kapatmak için bir anahtar içeren (varsayılan olarak açıktır) daha eksiksiz bir sürüm :

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
}

2

Ayrıca kullanabilirsiniz spongegelen moreutilspaket ve değil (yani hiçbir çıktı yönlendirmek gerekir teegürültü gizlemek için):

echo 'Add this line' | sudo sponge -a privfile

0

Sed -i kullanarak ile $ a ise , son satırdan sonra hem değişkenleri hem de özel karakterleri içeren metin ekleyebilirsiniz.

Örneğin, / etc / hosts dizinine $ NEW_IP ile $ NEW_HOST ekleme:

sudo sed -i "\$ a $NEW_IP\t\t$NEW_HOST.domain.local\t$NEW_HOST" /etc/hosts

sed seçenekleri açıkladı:

  • -i yerinde
  • son satır için $
  • a eklemek için


0

Nasıl olur:
yankı metni | sudo dd status = none of = privilegedfile
/ proc / sys / net / ipv4 / tcp_rmem'i değiştirmek istiyorum.
Ben yaptım:
sudo dd durumu = hiçbiri = / proc / sys / net / ipv4 / tcp_rmem <<< "4096 131072 1024000"
yankıyı tek satırlık bir belgeyle ortadan kaldırır


1
Aracılığıyla okumak için bir dakikanızı ayırın düzenleme yardım içinde yardım merkezindeki . Yığın Taşması üzerinde biçimlendirme diğer sitelerden farklıdır.
Dharman

-1

Bu benim için çalıştı: orijinal komut

echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment

Çalışma komutu

echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment

1
Olmalı tee -a. Sadece teedosyanın üzerine yazacak!
codeforester

-6

Eklemek için kullandıktan sonra dosyanın sahipliğini değiştirebilir ve geri değiştirebilir cat >>misiniz?

sudo chown youruser /etc/hosts  
sudo cat /downloaded/hostsadditions >> /etc/hosts  
sudo chown root /etc/hosts  

Bunun gibi bir şey senin için mi?


4
Chown kullanmak yıkıcı bir komuttur. Bir yapılandırma yöneticisi bunu güncellemek için kullandıysa / etc / hosts, aniden / etc / hosts köke değil config kullanıcısına aittir. potansiyel olarak / etc / hosts erişimine sahip olmayan diğer işlemlere yol açar. Sudo'nun asıl amacı, bir şeyin kökünde oturum açmasını önlemek ve sudoers aracılığıyla daha fazla kısıtlama da olabilir.
David
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.