Настройка сетевых маршрутов в Linux (CentOS)

Эта ситуация называется «race condition» («состояние гонки»), и часто встречается в плохо спроектированных системах, где есть хотя бы два параллельных процесса.

Добавление пути в пользовательскую переменную Path

Для добавление пути, заданного аргументом командной строки, скрипт выполняет следующие действия:

  • Считывает текущее значение переменной Path из реестра (пользовательские переменные находятся здесь HKCU\Environment\Path), основан на Чтение из реестра в скрипте WSH.
  • Проверяет, возможно, этот путь уже добавлен, в этом случае скрипт завершает свою работу.
  • Добавляет путь к значению переменной Path.
  • Сохраняет итоговое значение вызовом SETX. Почему именно через SETX, а не через сохранение значения обратно в реестр? Разница в том, что изменение, сделанное через SETX, начинает работать сразу (для новых процессов, конечно), а изменения, сохранённые через реестр, начнут работать только после выхода-входа пользователя.

Код скрипта user_path_:

var wsh_shell = («»); var path = wsh_((0)); var v = «»; try { v = wsh_(«HKCU\\Environment\\Path»); } catch ( e ) { } if ( v != «» ) { for ( var i = new Enumerator((«;»)); !(); ()) if ( () == ().toUpperCase() ) (0); if ( () != «;» ) v += «;»; } v += path; if ( wsh_(«setx Path \»» + v + «\»»,0,true) != 0 ) («setx failed.»);

Пример добавления пути к программе nhsms, установленной в профиль пользователя, из командной строки:

cscript //nologo user_path_ «%localappdata%\nhsms»

Работа с переменными в shell

В последнем примере Мефодий воспользовался подсмотренным у Гуревича приёмом: присвоил некоторое значение переменной окружения в командной строке перед именем команды. Командный интерпретатор, увидев «=» внутри первого слова командной строки, приходит к выводу, что это — операция присваивания, а не имя команды, и запоминает, как надо изменить окружение команды, которая последует после. Переменная окружения LC_TIME предписывает использовать определённый язык при выводе даты и времени а значение «C» соответствует «стандартному системному» языку (чаще всего — английскому).

Читайте также:  Оптимизация оперативной памяти Windows

Если рассматривать shell в качестве высокоуровневого языка программирования, его переменные — самые обычные строковые переменные. Записать значение в переменную можно с помощью операции присваивания, а прочесть его оттуда — с помощью операции подстановки вида $переменная:

[[email protected] methody]$ A=dit [[email protected] methody]$ C=dah [[email protected] methody]$ echo $A $B $C dit dah [[email protected] methody]$ B=» » [[email protected] methody]$ echo $A $B $C dit dah [[email protected] methody]$ echo «$A $B $C» dit dah [[email protected] methody]$ echo ‘$A $B $C’ $A $B $CПример 10. Подстановка значений переменных

Как видно из примера, значение неопределённой переменной (B) в shell считается пустым и при подстановке не выводится никаких предупреждений. Сама подстановка происходит, как и генерация имён, перед разбором командной строки, набранной пользователем. Поэтому вторая команда echo в примере получила, как и первая два параметра («dit» и «dah»), несмотря на то, что переменная B была к тому времени определена и содержала разделитель-пробел. А вот третья и четвёртая команды echo получили по одному параметру. Здесь сказалось различие между одинарными и двойными кавычками в shell: внутри двойных кавычек действует подстановка значений переменных.

Переменные, которые командный интерпретатор bash определяет после запуска, не принадлежат окружению, и, стало быть, не наследуются дочерними процессами. Чтобы переменная bash попала в окружение, её надо проэкспортировать командой export:

[[email protected] methody]$ echo «$Qwe — $LANG» — ru_ [[email protected] methody]$ Qwe=»Rty» LANG=C [[email protected] methody]$ echo «$Qwe — $LANG» Rty — C [[email protected] methody]$ sh $ echo «$Qwe — $LANG» — C $ exit [[email protected] methody]$ echo «$Qwe — $LANG» Rty — C [[email protected] methody]$ export Qwe [[email protected] methody]$ sh $ echo «$Qwe — $LANG» Rty — C $ exitПример 11. Экспорт переменных shell в окружение

Здесь Мефодий завёл новую переменную Qwe и изменил значение переменной окружения LANG, доставшейся стартовому bash от программы login. В результате запущенный дочерний процесс sh получил изменённое значение LANG и никакой переменной Qwe в окружении. После export Qwe эта переменная была добавлена в окружение и, соответственно, передалась sh.

Читайте также:  Как узнать MAC-адрес компьютера: обзор способов

Основные

Помощь

Забыли аргументы для cp? Какая опция у команды mkdir? Вот вам подсказка:

help nano # кратко о команде “nano” man nano # подробная информация о “nano”

Конвейер

Зачастую с его помощью перенаправляют вывод одной команды на ввод другой или приписывают команду к файлу:

a | b # конвейер: передать вывод команды a на ввод b a > # сохранить вывод команды a в (перезаписать) a >> # сохранить вывод команды a в (добавить) echo «Hello!» | xargs echo # направить вывод первой команды, как аргумент второй

Фильтрация вывода

Бывает, что команда выводится слишком долго. В этом случае вы либо разделите страницу с помощью команды more или less, либо выведите строки, которые содержат специальное слово или предложение с grep:

cat | more # постранично показывает содержимое cat | постранично показывает содержимое , и позволяет перемещаться по файлу cat | grep “I love you” # показывает строчку, где расположена строка “I love you”

Очистка экрана

Слишком много текста в терминале? Просто напишите clear и продолжайте работать.

clear # очистка терминала

Как добавить директорию в PATH

PATH — это системная переменная, содержащая список директорий, в которых ОС будет искать исполняемый файл при вызове команды из консоли.

В Windows 10 можно добраться до настройки PATH так: Этот компьютер → Свойства → Дополнительные параметры системы → Дополнительно → Переменные среды. Или вызовом «Изменение переменных среды текущего пользователя» в результатах поиска.

В окошке «Переменные среды» в блоке «Переменные среды пользователя %USERNAME%» находим строку PATH, выделяем кликом, жмем кнопку «Изменить…» и в появившемся окошке нажимаем «СОздать» для добавления ещё одного элемента. В самом элементе нужно вписать путь к папке Sublime Text (путь к файлу , который должен лежать в папке программы). В моем случае получилось так:

c:\Program Files\Sublime Text 3\

После перезапуска консоли можно наслаждаться командой subl.

Как добавить или удалить статический маршрут?

Чтобы добавить новый маршрут к определенной IP подсети в таблицу маршрутизации Linux, нужно выполнить следующую команду:

# ip route add via

Таким образом, мы добавим маршрут для IP сети через шлюз

Формат команды ip route очень похоже на синтаксис в Cisco IOS. Здесь также можно исопльзовать сокращений, например вместо ip route add можно написать ip pro ad.

Также можно добавить отдельный маршрут для одного IP адреса (хоста):

# ip route add via

Можно сделать аналог null route маршрута в Cisco (ip route null0), пакеты в такую сеть удаляются по причине No route to host:

# ip route add blackhole

Как добавить или удалить статический маршрут?

Маршруты, добавленные таким образом являются временным и будут работать до перезагрузки сетевой службы или сервера.

Чтобы удалить созданный вручную маршрут, выполните:

# ip route del

Как видите, маршрут удален из таблицы маршрутизации.

Чтобы добавить постоянный маршрут, нужно создать файл для этого маршрута, либо добавить правило в файл (выполняется при загрузке сервера).

Чтобы добавить постоянный (статический) маршрут, нужно знать имя сетевого интерфейса, который будет использоваться для маршрутизации. Узнать имя сетевого интерфейса можно командой:

# ip a

В моем случае, интерфейс enp0s3.

Более подробная статья о настройке сетевых интерфейсов в CentOS.

Далее открываем следующий файл:

# nano /etc/sysconfig/network-scripts/route-enp0s3

И добавляем туда строку с маршрутом:

via

После добавления маршрута в файл нужно перезапустить сервис network:

# service network restart

Как добавить или удалить статический маршрут?

После перещаауска сетевого сервиса, в таблице маршрутизации появился статический маршрут.

Также можно добавить команду добавления нового маршрута в файл , чтобы он автоматически добавлялся при загрузке сервера. Откройте файл:

# nano /etc/

И укажите команду добавления маршрута:

# ip route add via

Теперь, если ваш сервер будет перезагружен, маршрут пропишется автоматически при загрузке системы.