Добавление строки в файл hosts, получение прав доступа при использовании sudo - Mac


13

Я пытаюсь добавить строку в файл hosts на моем Mac, выполнив однострочную команду на терминале.

Я думал, что это будет легко с помощью sudo, но он возвращает «Отказано в разрешении», когда я пытаюсь добавить >>в файл hosts, но он работает, если я пытаюсь заменить >содержимое хостов.

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

sudo echo test > /etc/hosts
Password:
$ 

ОС обновлена.


просто используйте текстовый редактор (
начинающийся

1
Я хочу сделать скрипт, который поможет автоматизировать это, поэтому текстовый редактор не поможет в этом случае.
Монетный двор

Ответы:


16

Это потому, что echoон запускается от имени root, но оболочка - это та, которая фактически выполняет перенаправление. Вам нужно создать новую оболочку, чтобы это работало:

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

Изменить: я не видел тот факт, что >перенаправление работает; Я не могу этого объяснить.


Я чувствую, что стоит отметить эту утилиту, teeпотому что разрешение выполнения подоболочки sudoв большинстве случаев является и должно быть заблокировано в большинстве производственных сред по соображениям безопасности.
Стив Бузонас

9

Вместо того, чтобы запускать echo через редирект, который будет запускаться как ваш текущий пользователь, а не как root, поскольку echo запускается в вашем примере, используйте tee, как предполагает Стив Бузонас.

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

Судо теперь применяется к команде tee. '-A' добавляет к файлу

Это также выведет тройник к стандартному выводу. Если вы не хотите видеть «тест» в вашем терминале, также добавьте: > /dev/nullв конец этой строки.


1

Чтобы убедиться, что новая строка была создана первой, я использовал это:

sudo -- sh -c "echo  \ \ >> /etc/hosts";sudo -- sh -c "echo 127.0.0.1  testdomain.com >> /etc/hosts"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.