Dodanie linii do pliku hosts, odmowa uzyskania uprawnień podczas korzystania z sudo - Mac

14

Próbuję dodać wiersz do pliku hosts na komputerze Mac, wykonując polecenie w jednym wierszu na terminalu.

Myślałem, że będzie to łatwe przy użyciu sudo, ale zwraca „odmowa uprawnień”, gdy próbuję dodać >>do pliku hosts, ale działa, jeśli spróbuję zastąpić >zawartość hostów.

sudo echo test >> /etc/hosts
-bash: /etc/hosts: Permission denied
$

sudo echo test > /etc/hosts
Password:
$ 

System operacyjny jest aktualny.

Mennica
źródło
wystarczy zmodyfikować / etc / hosts za pomocą edytora tekstu (uruchomionego w sudo )
MrSmith42,
1
Chcę stworzyć skrypt, który pomoże to zautomatyzować, więc edytor tekstu nie pomógłby w tym przypadku.
Miętowy

Odpowiedzi:

17

To dlatego, że echojest uruchamiany jako root, ale powłoka faktycznie wykonuje przekierowanie. Aby to zadziałało, musisz utworzyć nową powłokę:

sudo -- sh -c "echo test >> /etc/hosts"

Edycja: Nie widziałem faktu, że >przekierowanie działa; Nie umiem tego wyjaśnić.

Aluísio ASG
źródło
Uważam, że warto zauważyć to narzędzie, teeponieważ ze względu na bezpieczeństwo zezwalanie na wykonywanie podpowłoki sudojest i powinno być blokowane w większości środowisk produkcyjnych.
Steve Buzonas,
9

Zamiast uruchamiać echo przez przekierowanie, które będzie uruchamiane jako bieżący użytkownik, a nie root, ponieważ echo jest uruchamiane w twoim przykładzie, użyj tee, jak sugeruje Steve Buzonas

 echo 'test' | sudo tee -a /etc/hosts

Sudo jest teraz stosowane do polecenia tee. „-A” dołącza się do pliku

Spowoduje to również wyprowadzenie tee na standardowe wyjście. Jeśli nie chcesz widzieć „testu” w swoim terminalu, dodaj także: > /dev/nullna końcu tego wiersza.

użytkownik2926534
źródło
1

Aby upewnić się, że najpierw utworzono nową linię, użyłem tego:

sudo -- sh -c "echo  \ \ >> /etc/hosts";sudo -- sh -c "echo 127.0.0.1  testdomain.com >> /etc/hosts"
blizzrdof77
źródło