Jak dołączyć do pliku jako sudo?


271

Chcę zrobić:

echo "something" >> /etc/config_file

Ponieważ jednak tylko użytkownik root ma uprawnienia do zapisu tego pliku, nie mogę tego zrobić. Ale następujące też nie działa.

sudo echo "something" >> /etc/config_file

Czy istnieje sposób na dołączenie do pliku w takiej sytuacji bez konieczności otwierania go za pomocą sudoedytora, a następnie ręcznego dodawania nowej zawartości?


Używam Ubuntu 9.04 i jestem w stanie używać sudo do każdego polecenia, jakiego potrzebowałem do tej pory. Zadziałało odradzanie podpowłoki.
Matt Norris,

Odpowiedzi:


390

Użyj tee -a(lub tee --append) zsudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

Więc twoje polecenie staje się

echo "something" | sudo tee -a /etc/config_file

Zaletami teenadrzędnego wykonywania Bash z uprawnieniami administracyjnymi są

  • Nie wykonujesz Bash z uprawnieniami administracyjnymi
  • Tylko część „zapis do pliku” działa z zaawansowanymi uprawnieniami
  • Cytowanie złożonego polecenia jest znacznie łatwiejsze

2
W systemie OS X tee wydają się mieć tylko flagę -a.
Lri

Debian 8 teema -aflagę dołączającą.
glina

9
Użyj, echo "output" | sudo tee -a file > /dev/nulljeśli chcesz pominąć wyjście konsoli.
Moshe Bixenshpaner,

Działa dobrze również dla WSL.
kayleeFrye_onDeck

50

Przekierowanie jest wykonywane w bieżącej powłoce. Aby wykonać przekierowanie z podwyższonymi uprawnieniami, musisz uruchomić samą powłokę z podniesionymi uprawnieniami:

sudo bash -c "somecommand >> somefile"

26

Poproś sudo o odrodzenie podpowłoki:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

W tym przykładzie sudo uruchamia „sh” z resztą jako argumentami.

(jest to pokazane jako przykład na stronie podręcznika sudo)


8
Powodem jest to, że to twoja powłoka (działająca jak ty) dokonuje przekierowania, a nie sudo. Ponieważ nie masz uprawnień do zapisu do pliku, pojawia się błąd odmowy uprawnień. Ta odpowiedź polega na uruchomieniu nowej powłoki, która działa jako root i dlatego może zapisywać do pliku.
Randy Orrison

To nie jest poprawna odpowiedź. To poprawna odpowiedź. Akira ma lepszą, bo logika zawarta w tej odpowiedzi.
TOOGAM

6

Zwykle używam powłoki TUTAJ z sudo tee -a . Coś w stylu:

sudo tee -a /etc/profile.d/java.sh << 'EOF'
# configures JAVA
JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
EOF

4

Moim zdaniem najlepsze w tym przypadku jest dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END

3

Może występować problem z sudo i przekierowaniem. Zamiast tego użyj edytora tekstu, aby dodać linię.

sudo nano /etc/profile

Możesz zamiast tego spróbować su

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

Niestety dało to ten sam wynik.
Matt Norris,

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'powinno działać. skoro nie ma nic, co powłoka mogłaby omyłkowo rozwinąć w arg, aby uzyskać echo, należy zacytować całe polecenie.
quack quixote

To fantastycznie. Teraz zrób to jako część skryptu.
Ernie Dunbar,

0

To nie zadziała, próbujesz przekierować (używając >>) wyjście sudo. To, co naprawdę chcesz zrobić, to przekierować wyjście echo. Sugeruję po prostu użyć swojego ulubionego edytora i ręcznie dodać ten wiersz /etc/profile. Ma to tę dodatkową zaletę, że można sprawdzić, czy /etc/profilejuż ustawiono JAVA_HOME.


0

Użyj ex -way:

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

i zamień na FOOswoją zmienną, aby dołączyć.

W niektórych systemach (takich jak OS X) /etc/profileplik ma 444 uprawnienia, więc jeśli nadal otrzymujesz odmowę , sprawdź najpierw i popraw je:

sudo chmod 644 /etc/profile

następnie spróbuj ponownie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.