Hosts Commander — модификация hosts из командной строки

    Я хотел бы посвятить немного времени файлу hosts. Года два назад, когда я в очередной раз забирался в глубину системных директорий, чтобы подправить всего одну строчку в этом файле, мне подумалось, как было бы классно работать с hosts из командной строки. Тогда идея отправилась в дневничок, и долгое время оставалась нетронутой. Пару дней назад я реализовал почти все идеи, которые пришли в голову по этому поводу. Результатом делюсь с хабрасообществом. Буду рад, если кому-нибудь пригодится.

    Что получилось?


    А получилась небольшая программа hosts.exe, которую кратко можно охарактеризовать так:
    • Операции добавления, удаления и отключения хостов
    • Поддерживает операции над хостами по маске
    • Простые выборки из hosts по атрибутам и маске
    • Создание резервных копий hosts и откат последней операции
    • Поддержка IDN (можно создавать русскоязычные домены)
    • Поддержка IPv6 адресов
    • Поддержка алиасов (несколько доменных имён в строке)
    • Сохраняет исходное оформление и кодировку файла hosts
    • Большое количество алиасов для каждой команды (кому как удобнее)

    Где можно скачать?


    Страница проекта: Hosts Commander
    Программа: hostscmd.zip (10 кб., .NET 3.5)
    Исходный код: репозиторий (C#, VS2010)

    Как этим пользоваться?


    Если предварительно скопировать файл программы в системную директорию, то утилита всегда будет готова к работе в консоли или по нажатию Win+R.
    hosts list [enabled|disabled] [visible|hidden] <mask>
    — Отображает хосты, соответствующие требованиям
    — Если требования не указаны — отображает все хосты
    — Алиасы: view, select
    — Пример: list enabled visible local*
    — Пример: list vk
    hosts add <host> <aliases> <addr> # <comment>
    — Добавляет новый хост, <addr> по умолчанию 127.0.0.1, <comment> можно не указывать
    — Парамер <aliases> может отсутствовать
    — Параметры до # могут иметь произвольный порядок
    — Всё что после # — комментарий
    — Алиасы: new
    — Пример: hosts add myhost.dev
    — Пример: hosts add another.dev 192.168.1.1 # Remote host
    hosts set <host|mask> <addr> # <comment>
    — Обновляет IP адрес или комментарий хоста
    — Всё что после # — комментарий
    — Алиасы: update, change
    — Пример: hosts set myhost.dev # new comment
    — Пример: hosts set another.dev 192.168.1.1
    hosts rem <host|mask>
    — Удаляет конкретный хост или соответствующие маске
    — Алиасы: del, remove, delete
    — Пример: hosts rem *.local
    hosts enable <host|mask>
    — Включает конкретный хост или соответствующие маске
    — Алиасы: on
    — Пример: hosts enable localhost
    hosts disable <host|mask>
    — Выключает конкретный хост или соответствующие маске
    — Алиасы: off
    — Пример: hosts disable local?ost
    hosts print
    — Выводит оригинальное содержимое файла hosts
    — Алиасы: raw, file
    hosts format
    — Форматирует строки в файле
    hosts clean
    — Удаляет комментарии и форматирует строки в файле
    hosts backup <name>
    — Делает резервную копию файла hosts
    — Параметр <name> не обязателен, по умолчанию он — backup
    hosts restore <name>
    — Восстанавливает файл hosts из резервной копии
    — Параметр <name> не обязателен, по умолчанию он — backup
    hosts rollback
    — Откатывает последнюю операцию с файлом hosts
    hosts open
    — Открывает файл hosts в блокноте
    hosts hide <host|mask>
    — Прячет хосты из списка при запуске hosts.exe без параметров
    — Пригодится, если у вас много хостов, которые не хотелось бы всегда видеть перед глазами
    hosts show <host|mask>
    — Возвращает хосты в основной список

    Напоследок


    Напоследок хотелось бы написать, что программа с самого начала писалась «для себя», и я реализовал почти все функции, которые мне хотелось в ней видеть. Тем не менее, я буду рад увидеть какие-то замечания и предложения в комментариях.
    Работоспособность программы проверялась на Windows XP. Обладателей более современных версий Windows хотелось бы попросить отписаться, как поведёт себя программа с включённым в системе UAC.

    Спасибо за внимание.
    Support the author
    Share post

    Comments 163

    • UFO just landed and posted this here
        0
        А почему должны?
          0
          Потому что программа правит host, к которому у многих антивирусов повышенный интерес.
          И то что программа обращается к хосту эвристика думаю определить сможет. поддерживаю вопрос :)
            0
            Хм. Действительно, как это я не подумал об этом. У меня Avira Antivir во время разработки ни разу не ругалась. Судя по результату VirusTotal другие антивирусы поступают так же.
              0
              Статика может и не брать (хотя, все пути в плейнтексте), HIPS-овые функции защитных продуктов (в т.ч. АВ) должны срабатывать.
              • UFO just landed and posted this here
            0
            Ругаеться UAC :) И весь кайф командной строки теряется, если не запускать консоль под админом
              0
              Он не ругается, а предупреждает. На файл hosts выставлены права «редактирование для админов», поэтому логично что программе нужно повышение.
            +3
            Во первых — Вы молодец! Во вторых такую программу надо уст. на половину комп-ов моих знакомых, которые через день звонят и...:
            yyy-Я В Контакт. Не могу войти! пишет отправь смс.
            yyy-У меня сайты не работают!
            и т.д… (Если рассматривать червя который хост правит)

            А вот если такой фикс поставить, то достаточно будет сказать:
            Открой консоль и напиши: hosts restore
            Жить станет легче :)
              +2
              Спасибо :) Для данного случая можно было бы применить менее радикальный метод: hosts rem vk* — удалит все записи, начинающиеся на vk.
                +2
                +
                route -f
                  0
                  Да, эта фигня тоже часто нужна, последнее время.
                  +1
                  В тему: согласно мелкомягким восстановление параметров файла hosts по умолчанию, например, для Windows XP, сводится к одной записи: 127.0.0.1 localhost
                  =)
                  +5
                  плюсанул, но.
                  1. не вижу ни чего, ради чего стоит тянуть dotNET. Все делается на bat файлах.
                  2. вы под админом сидите? :) не айс.
                  3. у программы проблемы с кодировкой.В host кодировку не менял, все стандартное
                  4. если нет админских прав — пишет что запись добавлена. но не может создать бэкап.
                    +1
                    Спасибо за комментарий. По порядку:
                    1. Для работы с хостами по маскам, включения-отключения хостов, различных выборок и др. одним bat файлом на мой взгляд не удалось бы обойтись. Хотелось реализовать более-менее стабильное приложение, которое не испугало бы например перемещение hosts в другой каталог (с изменением ссылки в реестре на его конечно же).
                    2. К сожалению, под Windows XP с большим набором старых программ тяжело работать под ограниченной учётной записью.
                    3. У меня английская Windows, поэтому и не заметил подобных проблем. Судя по всему в русской версии файл сохранён в кодировке cp1251. В следующем обновлении учту этот момент.
                    4. Программа пытается сделать бэкап до того момента, как сохранит все изменения в оригинальный файл, а ADDED в начале символизирует о том, что в памяти операцию удалось провести успешно. С следующим обновлением сделаю более понятный вывод ошибок.
                      0
                      В реестре нет ссылки на файл hosts и его расположение не может быть переопределено редактированием реестра.
                        +2
                        ru.wikipedia.org/wiki/Hosts
                        Расположение
                        %SystemRoot%\system32\drivers\etc\ по умолчанию. Расположение можно изменить в ключе реестра \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DataBasePath.
                          0
                          technet.microsoft.com/en-us/library/cc962455.aspx
                          Specifies the path to the standard Internet database files, such as Hosts.sam, Lmhosts.sam, Services.sam, Networks, Protocol, and Quotes. The Windows Sockets interface uses this entry.

                          Файла hosts в описании нет, кроме того попробуйте самостоятельно изменить его расположение этим ключом.
                          0
                            +1
                            Повторю вопрос — вы пробовали лично менять расположение файла hosts изменением ключа в реестре? У меня этот способ не работает.
                              +1
                              перезагружаться не пробовали?
                                +1
                                Пробовал. А вы, похоже, нет :)
                                  0
                                  машина не выключается неделями, проверять не стал:) лень:)
                                    0
                                    Аналогично, проверял на виртуальной. VEG хотя бы для интереса проверил перед использованием в своей программе. Мои тесты показали, что независимо от ключа и наличия/отсутствия файла hosts в папках, учитывается только путь по умолчанию. Если кто-то получит другие результаты — пусть поделится рецептом ;)
                                      0
                                      Если есть рабочий способ — вот вредители обрадуются…
                                      Открываешь hosts — а там всё чисто, т.к. рабочий файл вообще в другом месте.
                        +2
                        Думаю стоит встроить в программу требование запуска от имени администратора при модификациях hosts либо какую-то операцию для повышения привилегий уже после запуска путём ввода пароля администратора (если такое возможно). Разбираться уже на свежую голову буду.
                          0
                          открытие hosts для записи -> облом -> runas
                            +2
                            Нужно лишь вставить манифест, делается очень легко. Я в свое время тоже писал такую утилиту (правда она командную часть имеет слабую, но с визуальным интерфейсом). hostseditor.codeplex.com/

                            Там это реализовано (повышение прав), посмотрите, если хотите.
                              0
                              Ух, как жаль, что я почему-то не нашёл вашу программу раньше. Может быть и не изобретал бы этот велосипед :) Спасибо большое за подсказку!
                                +1
                                Предлагаю объеденить в один софт :)
                                  0
                                  Весьма интересное предложение. Было бы неплохо в итоге получить комплект из двух программ: оконный и консольный варианты. Вечером поработаю над обновлением, заодно постараюсь оценить, на сколько сильно можно объединить эти две программы.
                            0
                            Программа по умолчанию работает с файлом в кодировке UTF-8, то есть все созданные программой записи отображаются корректно. На мой взгляд UTF-8 всё же лучше и универсальнее, чем Windows-1251. Постараюсь реализовать в программе конвертацию из Windows-1251 в UTF-8 при необходимости, чтобы стандартное содержимое файла в русских Windows не теряло свой опрятный вид.
                              0
                              Смело. не боитесь криков хомячков «разкукожте мой файл обратно»? =) все же лучше оставлять ту кодировку которая была, или определять в какой кодировке файл (в 7 он по моему юникод?) и с тем работать.
                                0
                                Стандартный блокнот в Windows XP поддерживает UTF-8. Думаю, большинство пользователей не заметило бы смены кодировки :)
                                  +1
                                  1. Это не ваш файл, ни вам решать каким ему быть.
                                  2. Мало ли кто что с ним вздумает делать. консоль восстановления как UTF8 воспримит? edit досовский?
                                  3. Встроенная утилита type не умеет utf в результате получится совсем страшно. Вашу программу могут и удалить а файл останется измененный.
                                  4. Не вы один пытаетесь работать с этим файлом. другие программы могут не ожидать что файл в utf (saddo ваша программа ка себя поведет с utf файлом?) в лучшем случае не сможет работать — в худшем испортит вовсе файл.
                                  5. От программы ждут что она будет делать то что должна, а уж ни как не заниматься оптимизацией моей ОС. много таких оптимизаций в результате вообще убьют ОС. Амбиции, понимаю, но делайте хорошо свою программу, а не операционку твикайте.
                                    0
                                    UTF-8 спроектирован так, чтобы не конфликтовать с программами, которые читают файл с любой ANSI кодировкой. Максимум, что может произойти — это не-ASCII символы будут отображены неправильно (то есть проблема касается только русских комментариев в файле).
                                    Программа saddo, как оказалось, тоже работает с этим файлом в кодировке UTF-8. То есть русские символы в windows-1251 тоже были потеряны. Логично, ведь в .NET всё по умолчанию в Юникоде :)
                                    Впрочем, вы меня всё равно убедили. Я реализую загрузку, которая будет проверять текущую кодировку файла (UTF-8 или системная ANSI), и по возможности сохранять её.
                              0
                              Простите, но в 2010 году н.э., .NET должен стоять везде. Или вы до сих пор на Win98?
                                +1
                                Кому должен? У меня он на нетбуке не стоит например. Он мне не нужен в работе, да и места нет на диске что бы «на всякий случай» его ставить.
                                  0
                                  Нужен он софту. Если у вас такого софта нет — ну что ж, повезло. У меня тот же PoSh требует наличия .NET. Ну и плюс я не ограничен 4Гиговыми ССД и устаревшими ОС, а в Висте и 7, дотнет есть изначально…
                                  0
                                  Почему можно узнать? У меня на WinXP не стоит, незачем (а на linux стоит Mono :) но в нём программа не работает, вываливается с эксепшеном про регистрикей )
                                –5
                                  0
                                  Не, ну серьезно… инструкцию по использованию хостс файла можно уместить в одну строку + 1 еще одна строка-пример. Notepad++ может делать поиск-замену (я про vi вообще молчу).
                                    0
                                    Возможно. Но для случаев, когда например нужно временно отключить все хосты, оканчивающиеся на .local, на мой взгляд намного удобнее написать: hosts disable *.local, чем вручную искать каждую строчку и ставить в начале знак комментария, или делать хитрый макрос.
                                      +1
                                      :%s/^\(.*\.local\)$/#\1/
                                  +8
                                  >как было бы классно работать с hosts из командной строки
                                  >получилась небольшая программа hosts.exe

                                  echo «127.0.0.1 habrahabr.ru» >> /etc/hosts
                                  echo «127.0.0.1 habrahabr.ru» >> C:\Шindows\System32\drivers\etc\hosts
                                    +4
                                    sudo!!!
                                      –2
                                      бр… парсер…
                                      sudo !!
                                      
                                        +1
                                        а вот хрен: echo выполнится из-под рута, а перенаправление в файл будет из под юзера.
                                          0
                                          sudo sh -c 'echo «127.0.0.1 habrahabr.ru» >> /etc/hosts' :)
                                          +3
                                          echo "127.0.0.1 microsoft.com" | sudo tee -a /etc/hosts :)
                                          –5
                                          Судо — это проблема убунтоводов. Обычно для правки системных конфигов логинятся рутом через su ;)
                                          А в Шindows для правки системных конфигов нужно пускать командную строку от имени администратора, так что права админа уже есть.
                                            +4
                                            sudo — это проблема sudoer'ов. Если надо править много конфигов в убунте, логинятся через sudo su — :)
                                              +4
                                              маньяков — убивать. sudo -i
                                                +1
                                                И так тоже, я хотел сказать о том, что sudo не в canonical придумали.
                                              +4
                                              Кстати, а почему не Шiпdoшs?
                                                0
                                                потому что язык сломать можно:)
                                                  0
                                                  использую sudo под win, вполне удобно
                                              0
                                              Win Key + R
                                              notepad %systemroot%\drivers\etc\hosts
                                                0
                                                >Модификация hosts из командной строки
                                                Вызов из командной сроки блокнота с параметром это уже другое.
                                              0
                                              Подойдёт для простых операций. Но так будет сложно реализовать операции с хостами по маске например.
                                                0
                                                cat /etc/hosts | sed "s/.*habrahabr.*//" > /etc/hosts и пр.
                                              0
                                              Три вопроса
                                              1. hosts может быть переназначен. Программа это учитывает?
                                              2. работает ли от юзера без прав редактирования файла?
                                              3. зачем вообще править hosts?
                                                –1
                                                Внезапно вопрос. Как переназначить hosts под Windows?
                                                    0
                                                    Нет, я просто не знал что в реестре переназначается.
                                                    Искал «Как переназначить hosts под Windows».
                                                      0
                                                      Я даже не знаю что ответить… вроде как почти все в винде в реестре конфигурируется.

                                                      А все таки зачем?

                                                      ответ на №2 я предполагаю отрицательный
                                                        0
                                                        Ну почти всё да не всё. Есть ещё ini файлы, и кое-что ещё можно junction point'ами перенаправить ;)
                                                        В Windows x64 тяжеловато его с первого раза найти. Переназначу потом его в папку куда-нибудь по ближе.
                                                          0
                                                          Все хост-трояны ищут файл hosts по дефолтному пути, при изменении его, я думаю примерно 80% этих потеряют актуальность.
                                                      0
                                                      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
                                                      скажу на память что параметр DataBasePath
                                                      0
                                                      1. Да, программа берёт путь к hosts файлу из реестра. Выше я писал об этом
                                                      2. Без прав редактирования файла программа не сможет его изменить
                                                      3. А нужно ли это — каждый может решить сам для себя.
                                                      0
                                                      Вот прочитал я всё это, и задумался… А зачем оно всё…
                                                      У меня файл hosts не менялся ни разу с момента установки Windows. Может быть я делаю что-то не так?
                                                      Но автор, безусловно, молодец.
                                                        0
                                                        веб-приложения локально не используете?
                                                        +7
                                                        edit "%systemroot%\drivers\etc\hosts"

                                                        открывается редактор консольный
                                                          0
                                                          в какой винде остался edit.com?
                                                            0
                                                            В XP остался.
                                                            Да и в 7-ке тоже есть.
                                                              0
                                                              в семерке нет
                                                                0

                                                                Есть
                                                                  0
                                                                  В 32х битной да, в 64х битной естественно нет.
                                                          0
                                                          Можно установить np++, а он установлен у большинства, то у меня, к примеру, он сохраняется во вкладке(пока ее не закроешь), и если запустить от имени администратора np++, то спокойно можно модифицировать hosts.
                                                            +1
                                                            Надо сделать доп функцию, пусть ваша программа блокирует hosts :)
                                                              +4
                                                              hosts.exe — похоже на название вируса. Я б увидел, непроизвольно удалил бы )
                                                                0
                                                                А я всегда пользовался ярлычком на рабочем столе с таким вот содержанием :)

                                                                C:\WINDOWS\system32\notepad.exe C:\WINDOWS\system32\drivers\etc\hosts
                                                                  +1
                                                                  для пользователей unix-like систем есть рубишный gem
                                                                  gem ghost
                                                                  github.com/bjeanes/ghost

                                                                  ну и если вдруг будет возможность поставить gem на винду, то тоже
                                                                    0
                                                                    В unix-like есть webmin ;)
                                                                    0
                                                                    Спасибо за Win+R!
                                                                      +1
                                                                      Ещё есть:
                                                                      Win + D
                                                                      Win + M
                                                                      Win + E
                                                                      Win + F
                                                                      Win + Break

                                                                      И в Windows 7 добавлено:
                                                                      Win + Tab
                                                                      Win + влево
                                                                      Win + вправо
                                                                      Win + вниз
                                                                      Win + вверх
                                                                        0
                                                                        Win +Break и Win + E не знал, спасибо!
                                                                          0
                                                                          Ещё очень помогает «Ctrl + Shift + Esc» для вызова диспетчера задач.
                                                                            0
                                                                            еще Ctrl+Esc

                                                                            Win+Tab работает и в XP. Просто переключает не окна а задачи на панели. мне удобнее использовать именно это сочетание.
                                                                              0
                                                                              WIN+B — переключает фокус ввода в системный трей, к часам.
                                                                              В Win7 есть еще:
                                                                              WIN+P — диалог подключения второго монитора или проектора
                                                                              WIN+X (на ноутбуках) — центр мобильности
                                                                      +1
                                                                      Не холивара ради, но всё-таки как мучаются люди под Windows, когда в других операционных системах есть всяческие sed, awk и т.п.
                                                                        –1
                                                                        О каких мучения идет речь, если ТС продемонстрировал узкоспециализированный инструмент, которой в своей сфере применения положит «sed, awk и т.п.» на лопатки? И еще вопрос ради моего самообразования. Что есть такого в «sed, awk и т.п.», чего нет в windows powershell?

                                                                          0
                                                                          sed есть сразу, ps надо ставить.
                                                                            0
                                                                            В Win7 из коробки, в Win2008 из коробки.
                                                                              +1
                                                                              Пока XP больше. Особено в корпоративном секторе.
                                                                                0
                                                                                И что? После данного тезиса powershell надо будет ставить на win7/2008? Я просто уточнил Ваше заявление, что powershell надо ставить далеко не на все рабочие места. Причем этих самых мест с ps гораздо больше, чем тех, что с упомянутыми sed/awk на борту.
                                                                                  0
                                                                                  После данного тезиса вам должно было придти понимание что ps нет на большинстве Win компов.
                                                                                  И его нужно ставить, в отличии от sed, который есть из коробки.
                                                                                  Поставить на все компы с XP (согласитесь в корпоративном секторе они преобладают) ps нужно сделать лишнее движение. Или ногами пройтись или политикой поставить. А если вы зашли телнетом и вдруг обнаруживает что ps нет… неприятно.
                                                                                  В то же время зайдя на линукс машины телнетом вы не сталкиваетесь с тем что вдруг нет sed.
                                                                                    0
                                                                                    А я этого понимания не искал, просто исправил Вашу же ошибку, что де «ps надо ставить». Тогда как на 20% рабочих мест его ставить не надо. Все остальные Ваши доводы просто пытаются обосновать, что 20% — это несущественно, статистическая погрешность, с чем я не совсем согласен. Но права иметь свою «систему мер и весов» я у Вас отнять не могу.
                                                                            +1
                                                                            так уж и на лопатки? даже не смешно
                                                                              +1
                                                                              А Вы имеете убеждение, что специализированный софт проигрывает в области свои специализации ПО широко назначения? Может нарисуете строчку с использованием sed/awk аналогичную приведенным ТС, чтобы мы вместе не посмеялись?
                                                                                0
                                                                                Добавить:
                                                                                echo 127.0.0.1 vkontakte.ru >> /etc/hosts

                                                                                Удалить
                                                                                cat /etc/host | grep -v vk > /etc/host

                                                                                Отключить:
                                                                                cat /etc/hosts | sed -e "/\(.*vk.*\)/#\1/" > /etc/host

                                                                                Лист:
                                                                                cat /etc/host

                                                                                Бэкап:
                                                                                cp /etc/host /etc/host.bak
                                                                                  0
                                                                                  cat /etc/hosts | sed -e "/\(.*vk.*\)/#\1/" > /etc/host
                                                                                  вс
                                                                                  hosts disable local?ost

                                                                                  Как-то не похоже «на лопатки» по юзабельности.

                                                                                  После прочтения статьи, кстати, решил написать простенький скрипт с таким же функционалом для linux. Спасибо, что показали несколько примеров :)
                                                                                    0
                                                                                    что мешает сохранить этот «cat....» в sh скрипт и вызывать так же
                                                                                    EdHostDis.sh vk
                                                                                    EdHostAdd.sh vk.com 127.0.0.1

                                                                                    Все скрипты будут весить около 5-9кб. и не понадобиться ни .net ни mono ;)

                                                                                    (написал по памяти, может не работать 100%, мог ошибиться в регэкспе ;) так что потренируйтесь на кошках)
                                                                                      0
                                                                                      Это и будет bash скрипт, только синтаксис «hosts add vk.com 127.0.0.1» мне нравится больше, чем «EdHostAdd.sh vk.com 127.0.0.1» :)
                                                                                        0
                                                                                        Назовите скрипт hosts, обрабатывайте в начале первый параметр. Кто запретит?
                                                                                          0
                                                                                          Так и собираюсь :) Но вообще, если бы не ставил целью лучшее изучение bash, то написал бы на, например, PHP — времени заняло бы куда меньше.
                                                                                        0
                                                                                        Точно также можно было это завернуть в WSH-скрипты. Не нужно было бы ни .net, ни моно. Но ТС сделал так, Вы бы сделали sh-скрипт, я бы ps-скриптлет. Вопрос предпочтения.
                                                                                          0
                                                                                          Чаще знаний о возможности выбора технологии и знакомства с какими-то из них. Например, изучать новый язык для написания такой утилиты может показаться неоправданным, даже если точно уверен, что этот язык с задачей справится эффективней.
                                                                                      0
                                                                                      echo 127.0.0.1 vkontakte.ru >> /etc/hosts
                                                                                      Не проверяет, существует ли уже подобный хост в hosts. Если существует, старая запись должна обновиться.
                                                                                      cat /etc/host | grep -v vk > /etc/host
                                                                                      Удалит строки, где например в комментариях случайно оказалось vk. То есть мы рискуем потерять нужные записи.
                                                                                      cat /etc/hosts | sed -e "/\(.*vk.*\)/#\1/" > /etc/host
                                                                                      Строки, которые уже закомментированы, будут закомментированы повторно. Опять не учитывается, что vk должен находиться только в имени хоста.
                                                                                        0
                                                                                        Будет странно если vk встретиться в IP 8-)

                                                                                        Согласен, но это уже доработки и защиты от дурака. Все это можно учесть, и написать более сложный но все же скрипт.
                                                                                          0
                                                                                          При чём тут IP, речь о подобном случае:
                                                                                          127.0.0.1 testing.dev # Это не vkontakte.ru
                                                                                          Ну и с повторным комментированием строк тоже неприятность, снять комментарии по маске тоже вряд ли красиво получится.
                                                                                          Написать это можно было на чём угодно. Совсем не понимаю, почему по вашему мнению скрипт обязательно лучше программы?
                                                                                            0
                                                                                            Вы правда не понимаете что это надуманая проблема и исключить из обработки комментированые строки или не искать в комментариях не сложно.
                                                                                            Или троллите?
                                                                                              +1
                                                                                              Обратите внимание на комментарий Guderian, с которого начался этот диалог.
                                                                                              hosts disable vk*
                                                                                              выглядит проще, чем
                                                                                              cat /etc/hosts | sed -e "/\(.*vk.*\)/#\1/" > /etc/host
                                                                                              при этом если в последнем случае постараться добиться повторения поведения первого, ваш вариант несколько прибавит в объёме.
                                                                                              Я это всего лишь к тому, что в специализированных решениях что-то есть.
                                                                                              И даже если вы напишите шелл-скрипт, который будет иметь аналогичный hosts.exe внешний интерфейс, это уже будет то самое специализированное решение, просто реализованное другими средствами.
                                                                                                +1
                                                                                                Значит мы говорили об одном и том же ;)
                                                                                                Про то что мои скрипты меньше я не говорил.
                                                                                          0
                                                                                          Ну Вы же понимаете, что это вопрос вопроса, при желании это легко дополняется. Всё зависит от постановки задачи и исходных данных. Так или иначе, но шелл-скрипт, который будет делать всё, будет гораздо проще и меньше Вашей утилиты.
                                                                                            0
                                                                                            Не забывайте, что моя программа ориентирована для Windows. Я и не сомневался, что под Linux вряд ли кто-то встретит подобную инициативу положительно :)
                                                                                              +1
                                                                                              Я встретил и даже попробовал её запустить под Ubuntu, но вылетает с эксепшеном :(
                                                                                                0
                                                                                                По идее её не сложно портировать. Из платформенно-зависимых вещей я использовал только функции для чтения из реестра пути к каталогу с hosts.
                                                                                                0
                                                                                                Да нет, речь просто о вопросе выбора инструмента. Если уж bash/grep/sed Вам не подходят (хотя они есть под виндами), возьмите awk, хотя программа получится больше. Не нравится awk — на здоровье, напишите на Tcl или Perl, но тогда размер ещё несколько возрастёт. Но писать такую программу на C#, C или C++ я бы не стал ни в коем случае, и не потому что C# — это MS, C — K&R, а C++ — Строуструп, а потому что это языки слишком низкого уровня для такой задачи.

                                                                                                И таки да, я бы такую утилиту назвал бы update-hosts (по аналогии с update-rc.d, update-grub и так далее).
                                                                                            +1
                                                                                            Добавить — в корзину. Даже не обрабатывает ситуации, когда запись уже присутствует.
                                                                                            Удалить — выглядит сложнее и совершенно не гарантирует правильного удаления (а если у меня vk в комменте присутсвует)
                                                                                            Отключить — сложнее и так же не гарантирует правильного отключения
                                                                                            Лист — это не листинг хостов, это вывод всего вместе с комментариями.
                                                                                            Бэкап — почти эквивалентно… до тех пор пока мне не захочется добавить в имя бэкапа таймстемп.
                                                                                    –2
                                                                                    блин. ни разу за 10 лет админско-программерской жизни не столкнулся с необходимостью править hosts. Имхо — эта программа просто ещё один костыль для тех кто не хочет системно заняться безопасностью и правильно настроить ось.
                                                                                      0
                                                                                      >>блин. ни разу за 10 лет админско-программерской жизни не столкнулся с необходимостью править hosts.

                                                                                      Пообслуживайте компанию программистов с разными продакшен и препродакшен серверами. И начнете редактировать.
                                                                                        0
                                                                                        вообще то для компании лучше dns поднять для этих целей. а правка hosts — это всё же костыль.
                                                                                          0
                                                                                          ДНС тоже поднят. Используется все.
                                                                                            0
                                                                                            Сервер DNS может резолвить запросы для некоторых доменов по разному в зависимости от IP клиента? Или на каждом компе устанавливать сервер и настраивать его как авторитетный для таких доменов?
                                                                                              0
                                                                                              на мой взгляд это извращения обусловленные неправильной постановкой задачи изначально — и как следствие — использование костылей.
                                                                                              если я не прав — приведите реальный пример.
                                                                                                0
                                                                                                Алгоритм работы скрипта завязан на имя домена, разработчикам и тестировщикам надо как-то локально проверять работу скрипта.

                                                                                                Общепринятое, имхо, решение — у каждого локально поднят веб-сервер с привязкой к этому домену, а домен прописан в hosts на 127.0.0.1. (если нужен доступ к реальному хосту домена, то строчка комментируется/удаляется). Вариация — веб-сервер поднят на удаленном developmment сервере, но каждый разработчик или тестировщик должен иметь возможность переключать локально для своего компьютера обращаться к development или production по точному имени.
                                                                                              0
                                                                                              Костыль — это когда у вас веб-девелоперы будут работать не в своей локальной песочнице с локальным веб-сервером, забинженым через hosts на имя разрабатываемого сайта, а дружно сливать свой шлак на сервер компании с прописанным в dns именем. А для распределенной команды фрилансеров будет вообще полный капут. Каждому из них при каждом чихе осуществлять деплой проекта на централизованный сервер?
                                                                                                0
                                                                                                Конечно костыль. Зачем использовать в dev имя prod сервера?
                                                                                                  0
                                                                                                  Для тестирования того, что всё на имени prod будет работать как нужно?
                                                                                                    0
                                                                                                    Во-первых, есть огромное количество CMS и прочих систем, для которых имя домена играет роль.
                                                                                                    Во-вторых, вы можете просто использовать вместо someproject.com локально someproject. Это гораздо удобнее localhost:4576, особенно когда вы работаете одновременно далеко не с одним проектом.
                                                                                                    В-третьих, ключевым было то, что девелоперы не будут гадить в том место, куда указывает единая на компанию dns-запись, которую Вы предложили.
                                                                                            0
                                                                                            Идем к UNIX-way — много мелких программ, которые делают 1-2 вещи, но делают это хорошо :).
                                                                                              0
                                                                                              Мы пойдем другим путем: runas /user: Администратор «notepad %systemroot%\system32\drivers\etc\hosts»
                                                                                                0
                                                                                                кстати, а runas умеет юзера SYSTEM?
                                                                                                0
                                                                                                Указываю свой админский аккаунт — все равно не дает сохранить потом файл на нужное место.
                                                                                                  0
                                                                                                  Проверьте права на файл у используемого аккаунта «Безопасность\Дополнительно\Дополнительные параметры безопасности\Действующие разрешения»
                                                                                                +2
                                                                                                «Если бы люди умели пользоваться vim, grep, sed, awk, то миллионы программных продуктов так никогда и не были бы созданы» © bash.org.ru
                                                                                                  +1
                                                                                                  Часто проще написать свою утилиту с жёстким функционалом, чем разбираться с многостраничными описаниями и мануалами универсальных программ. Что уж говорить, если утилита уже кем-то написана.
                                                                                                    –1
                                                                                                    Да уж. В то время как под Linux модифицировать hosts элементарно, пользователи Windows пишут специальные утилиты на каждый чих, посты и кучу комментов.
                                                                                                      0
                                                                                                      Я вот сейчас пишу аналогичную утилиту на языке bash'a — для меня конструкция типа «cat /etc/hosts | sed -e „/\(.*vk.*\)/#\1/“ > /etc/host» не является элементарной (один раз разобраться, вписать в скрипт и забыть можно, использовать ежедневно — напряжно каждый раз во второй консоли открывать man sed), а использовать иногда по нескольку раз в день конструкцию «sudo gedit /etc/hosts &» и потом редактировать ручками — утомляет.
                                                                                                        0
                                                                                                        Ну что ж… я рад, что ты используешь Linux… Но во-первых, sed можно использовать с -i, а во-вторых вот твой скрипт за 5 минут (он удаляет строку из файла по любому паттерну):

                                                                                                        #!/bin/bash

                                                                                                        FILE="./hosts";

                                                                                                        ACTION="$1";
                                                                                                        DOM="$2";
                                                                                                        IP="$3";

                                                                                                        usage() {
                                                                                                        echo «Usage: $0 ACTION DOMAIN [IP]»;
                                                                                                        }

                                                                                                        if [[ $# -lt 2 ]];
                                                                                                        then
                                                                                                        usage;
                                                                                                        exit;
                                                                                                        fi

                                                                                                        case $ACTION in
                                                                                                        add)
                                                                                                        echo add;
                                                                                                        echo "$IP $DOM" >> $FILE;
                                                                                                        ;;
                                                                                                        del)
                                                                                                        echo del
                                                                                                        grep -v "$DOM" $FILE > $FILE.tmp;
                                                                                                        mv $FILE.tmp $FILE;
                                                                                                        ;;
                                                                                                        *)
                                                                                                        usage;
                                                                                                        exit 1;
                                                                                                        esac

                                                                                                          0
                                                                                                          Что-то похожее и у меня получается (подсмотрел во всяких /etc/init.d/ скриптах как обрабатывают параметры-команды). Основная проблема в том, что универсальные паттерны (учитывающие, например, что строка в hosts может иметь вид «127.0.0.1 vk.com vkontakte.ru» и удалить нужно только vk.com) слишком сложны для написания на лету и иной раз проще написать скрипт на ЯП общего назначения, чем регулярку, учитывающие все варианты, не зря же ввели в синтаксис PCRE возможность составления выражения в несколько строк и комментирования.
                                                                                                            0
                                                                                                            гм… keep it simple. ты задачу неправильно ставишь. не нужно тебе все варианты учитывать. просто пиши парами и все. hosts не треснит, а если треснит, то для этого bind есть. Там уже все утилиты написаны.
                                                                                                            А в итоге… да… человек на ЯП написал несколько сотен строк кода… вместо этих 32ух. enbable/disable/backup/clean… прямо отдельный программный продукт, как правильно написал badguy. Не понимаю я этого.
                                                                                                              0
                                                                                                              Решить эту задачу для меня лишь средство достижения цели :) А цель — научиться писать шелл-скрипты, которые не только я буду использовать («сборка» проектов, их тестирование, деплой и т. п.). А тут задача поставлена хорошо мне знакомая, но о возможности автоматизации её я даже не задумывался, хотя в /etc/hosts бывает десятки раз за день захожу, чтобы закомментить или раскомментить строчку. Двух зайцев убью :)
                                                                                                    0
                                                                                                    Если ты уже под админом, можно просто добавить запись такой командой:
                                                                                                    echo 127.0.0.1 vkontakte.ru >> %systemroot%\system32\drivers\etc\hosts
                                                                                                      +3
                                                                                                      а что бы удалитьпотом:type %SystemRoot%\system32\drivers\etc\hosts | find /v «vk» > host.new && del %SystemRoot%\system32\drivers\etc\hosts && copy host.new %SystemRoot%\system32\drivers\etc\hosts && del host.new
                                                                                                        +1
                                                                                                        Достаточно type %SystemRoot%\system32\drivers\etc\hosts | find /v «vk» > %SystemRoot%\system32\drivers\etc\hosts
                                                                                                          0
                                                                                                          а оно не затрёт исходный файл в процессе его обработки? в юниксах вся цепочка работает сразу, потому исходный файл после такой команды будет потерян :)
                                                                                                            0
                                                                                                            Ну так это проблема юниксов, нэ? +)
                                                                                                            У меня, при двух строчках в нём, не затёрло, при одной (специально внесённого 127… vkonta...) результат был пустой файл, но проверять мне было лень. Win7 х32
                                                                                                              0
                                                                                                              не-а, это не проблема юниксов :)

                                                                                                              это как раз проблема виндов — в ней команды в цепочке, насколько я знаю, работают последовательно, а не параллельно (раньше, по крайней мере, так было).
                                                                                                          0
                                                                                                          голова :)
                                                                                                        0
                                                                                                        windows :D
                                                                                                          0
                                                                                                          [16:52:04] Vadim: да я хз, мне тут один умник по ссылке прошелся, после чего hosts перезаписался какой-то хренью, и видимо вот, пароль я свой кому-то подарил вот так
                                                                                                          0
                                                                                                          Сделал маленькое обновление:
                                                                                                          — Сохраняется исходная кодировка hosts (актуально для русских Windows)
                                                                                                          — Возможность создания стандартного hosts файла (recreate)
                                                                                                          — Программа требует для запуска администраторские права (для Vista и 7)
                                                                                                          code.google.com/p/hostscmd/downloads/list
                                                                                                            +1
                                                                                                            Прога обалденная!

                                                                                                            В windows 7 корректно требует администраторские права. Но после разрешения запускается в отдельном консольном окне, которое сразу же после вывода закрывается. В режиме list не успеваешь прочитать. Не уверен, что это можно исправить, т.к. Defraggler ведёт себя точно так же.

                                                                                                            Пока нашёл маленький workaround — нужно запустить сам cmd (или аналог) с правами администратора, тогда новых окон не открывается и вывод остаётся в его окне. Ну или как вариант — направить вывод в файл.
                                                                                                              0
                                                                                                              Спасибо.
                                                                                                              Сегодня вышла новая версия программы. Просьба протестировать на Windows 7.
                                                                                                              — Поддержка IDN (на экране отображается в декодированном виде)
                                                                                                              — Поддержка IPv6 адресов
                                                                                                              — Поддержка алиасов (несколько доменных имён в строке)
                                                                                                              — Новая операция rollback для отмены работы последней команды
                                                                                                              — add и set — разные команды (добавление и обновление соответственно)
                                                                                                              — Команда add сама догадывается о порядке параметров, всё что после # — комментарий
                                                                                                              — Возможность создавать несколько резервных копий hosts, задавая имя копии
                                                                                                                0
                                                                                                                Проверил всё кроме IPv6, работает. Ситуация с отдельным консольным окном не улучшилась — всё так же.
                                                                                                                Возможно, баг:
                                                                                                                hosts add a.pusher.we b.pusher.we
                                                                                                                hosts set a.pusher.we 192.168.0.2 — изменит и b.pusher.we тоже, хотя я мог просто забыть, что они алиасы.
                                                                                                                  0
                                                                                                                  Как я понял, наиболее адекватное решение проблемы с отдельным консольным окном — только запуск консоли от имени администратора. По этой части я только улучшил вывод ошибки, если у программы нет прав на запись в hosts.
                                                                                                                  По поводу алиаса. Я долго размышлял что делать в подобных случаях. Внутренности программы позволяют обрабатывать их отдельно. Но разрывать строку на две на мой взгляд немного нелогично, ведь это алиасы. Для такого случая я и сделал операцию rollback. При hosts set a.pusher.we 192.168.0.2 выведется какая строка была обновлена, и пользователь сразу поймёт что не так, и при необходимости сделает откат.
                                                                                                              0
                                                                                                              Вышла версия 1.4:
                                                                                                              — Встроенный командный интерпретатор, который запускается при вызове hosts без параметров
                                                                                                              — Команда hosts open открывает hosts в программе, ассоциированной с .txt
                                                                                                              — Команда hosts view упрощена, по умолчанию отображает только включённые и не скрытые хосты
                                                                                                              Скачать обновление можно на страничке проекта Hosts Commander.
                                                                                                                +1
                                                                                                                Спасибо, что развиваете программу!
                                                                                                                Я бы предложил убрать из топика прямые ссылки на скачивание версии 1.3 и оставить только ссылку на страницу проекта. Лично я по привычке заходил на страницу топика для скачивания, и не сразу заметил появление новой версии.
                                                                                                                0
                                                                                                                Вышла новая версия 1.5 с поддержкой запуска под Mono на Linux и Mac OS X. Описание в новой статье: habrahabr.ru/blogs/webdev/132963/

                                                                                                                Only users with full accounts can post comments. Log in, please.