Изменить файл Hosts с помощью echo - PullRequest
2 голосов
/ 19 января 2012

У меня есть два простых сценария, которые включают / отключают Cisco AnyConnect, когда я не хочу, чтобы он пытался подключиться при каждом входе в систему / при сетевом переходе.Все было хорошо, но я хотел добавить строку в файл hosts.Причина, по которой я использую «echo $ password | sudo -S» для большинства команд, заключается в том, что этот скрипт запускается из меню сценариев в Mac OS X. Окно терминала не открывается для обращения к запросам пароля sudo.

#!/bin/bash
#Start_AnyConnect.command

password=`/usr/bin/osascript <<EOT
with timeout of (30 * 60) seconds
    tell application "Finder"
        activate
        set myReply to text returned of (display dialog "Enter your password to authorize AnyConnect startup script" default answer "" with hidden answer)
    end tell
end timeout
EOT`

echo $password | sudo -S echo -e "127.0.0.1\twpad.company.com" >> /etc/hosts
sleep 2

echo $password | sudo -S mv "/Library/LaunchAgents_Disabled/com.cisco.anyconnect.gui.plist" "/Library/LaunchAgents/com.cisco.anyconnect.gui.plist"
echo $password | sudo -S mv "/Library/LaunchDaemons_Disabled/com.cisco.anyconnect.vpnagentd.plist" "/Library/LaunchDaemons/com.cisco.anyconnect.vpnagentd.plist"
echo $password | sudo -S launchctl load /Library/LaunchDaemons/com.cisco.anyconnect.vpnagentd.plist

sleep 5

open /Applications/Cisco/Cisco\ AnyConnect\ Secure\ Mobility\ Client.app

exit 0

У меня проблема в том, что

echo $password | sudo -S echo -e "127.0.0.1\twpad.company.com" >> /etc/hosts

добавляет "-e 127.0.0.1\twpad.company.com" вместо "127.0.0.1 wpad.company.com" в файл hosts.

Если я сам запускаю следующую команду, она работает как положено:

sudo echo -e "127.0.0.1\twpad.company.com" >> /etc/hosts

Есть ли другой способ сделать это?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 19 января 2012

Используемая версия echo не поддерживает -e.Когда вы используете sudo, вы получаете /bin/echo, а не встроенную оболочку echo.Вместо этого используйте printf:

echo $password | sudo -S printf "127.0.0.1\twpad.company.com\n" >> /etc/hosts

Также см. Вопрос, связанный с комментарием Jaypal относительно перенаправления и sudo.

4 голосов
/ 28 октября 2014

Это сработало для меня на OSX (последнее тестирование на Yosemite.) Надеюсь, это поможет кому-то еще!

sudo sh -c 'echo "127.0.0.1\twpad.company.com\n" >> /etc/hosts'

С форумов Macworld :

Фактическое объяснение состоит в том, что sudo вызывает подоболочку как root и передает ей только первый аргумент для запуска.

Как только команда завершает завершение подоболочки, ее стандартный вывод передается в >>.Это попытается открыть и добавить к своему аргументу файла исходный UID, который не работает из-за отсутствия привилегий.

Итак, решение состоит в том, чтобы передать всю командную строку, включая любые перенаправления, поэтому всепередается в sudo как один аргумент.

1 голос
/ 19 января 2012

Отредактируйте или создайте файл /etc/hosts.ac, чтобы добавить нужные записи хоста. Когда вы запустите AnyConnect, этот файл заменит «/ etc / hosts».

Добавление сценариев не требуется.

...