View Full Version : Проблема с переменными
WL-500g Premium, прошивка 1.9.2.7-8
Пишу в шелле echo $1 в ответ выводится пустая строка. Аналогично и для $2, $3, $4 и т.д.
Подскажите пожалуйста, в чем может быть проблема? Куда копать? Что еще можно проверить?
результат абсолютно правильный.
А что, собственно, мы ожидали увидеть то ???
А что, собственно, мы ожидали увидеть то ???
Я так понимаю, что в ответ я должен увидеть имена и IP адреса интерфейсов. Например $3 - имя внутреннего интерфейса, а $4 - его адрес.
Я ошибаюсь? :confused:
Я ошибаюсь? :confused:
однозначно, да!
Тогда подскажите, плиз, как в скрипте получить IP адрес адаптера br0.
На самом деле, мне необходимо в скрипте получить адрес сети адаптера br0 с префиксом. Т.е. например: 192.168.1.0/24
ЗЫ: Вообще странно, мне кажется даже Олег писал об этой возможности
:D
Это утверждение справедливо только для файла post-firewall
А вообще, почитайте что нибудь про переменные sh. Довольно подробное описание sh я встретил здесь: http://www.freebsd.org/cgi/man.cgi?query=sh&format=html
Получить ip адрес br0 можно так:
ifconfig br0 | awk '/inet addr/{print $2}' | awk -F: '{print $2}'
А вот добавить к этому субнет путем интерпретации вывода ifconfig задача выполнимая, но не совсем тривиальная.
Впрочем если добавить надо просто /24, то можно сделать так:
echo "`ifconfig br0 | awk '/inet addr/{print $2}' | awk -F: '{print $2}'`/24"
P.S. А вообще, на кой хрен это надо --- совсем непонятно. Поскольку адрес br0 все равно статично задан. Почему бы его просто не прописать как есть...
P.P.S. Нда... Там же еще последний разряд в 0 скидывать надо (а может необязательно?). Тогда можно сделать:
ifconfig br0 | awk '/inet addr/{print $2}' | awk -F: '{print $2}' | awk -F. '{print $1 "." $2 "." $3 ".0/24"}'
iplan=`/usr/sbin/ip -o -f inet addr show br0 | awk '{print $4;}'`
[routah:init.d] echo $iplan
192.168.1.1/24
:D
справедливо только для файла post-firewall
Про него я и говорю. У меня выдало сообщение "адаптер не найден" Правда файл post-firewall я запускал вручную, но из /usr/local/sbin/. Проверю еще раз, может что накосячил. Спасибо!
А можно ли как преобразовать адрес интерфейса в адрес сети с префиксом? Или может быть можно получить его для post-firewall каким либо другим способом? Очень не хочется прописывать его жестко. Необходимо для того, чтоб прописать POSTROUTING в nat при старте OpenVPN клиента.
Понимаю что задача не тривиальная. Но хотелось бы настроить один раз и в случае смены айпи адресации не перенастраивать правила файреволла. Тем более, что роутер будет периодически мигрировать. Роутер будет использоваться для организации одной из точек большой РСПД. Знаю про скорость. В данной точке не критично
А можно ли как преобразовать адрес интерфейса в адрес сети с префиксом?
На 1 сообщение выше.
djet :thumbs up: (тема апдейтится медленнее, чем предлагаются решения :) )
В общем ip в post-firewall --- $4, а вот субнет к ней --- наверное, см. на 2 поста выше.
В общем ip в post-firewall --- $4, а вот субнет к ней --- наверное, см. на 2 поста выше.
Ох, знать бы еще, что всегда будет возможность использовать 24 маску. Подозреваю, что врядли :(
192.168.1.1/24
Так в итоге будет 192.168.1.1/24 или 192.168.1.0/24 ?
А нужен адрес именно сети? Тогда так:
ip route list dev br0 scope link | awk '{print $1}'
ip route list dev br0 scope link | awk '{print $1}'
djet проверь строчку пожалуйста.
Наверно правильнее
ip route list dev br0 proto kernel scope link | awk '/$4/ {print}'
Но в любом случае в получаемой строке остается еще src 192.168.1.1
Тогда уж правильнее
ip route list dev br0 proto kernel scope link | awk '{print $1};'
192.168.1.0/24
Правда файл post-firewall я запускал вручную, но из /usr/local/sbin/.
Если Вы запускаете файл вручную, то, подозреваю, не передаете ему никаких параметров. :)
$1, $2, и т.д. - это не "волшебные" слова, которые подставляют то, что Вам нужно, а переменные, хранящие, соответственно, первый, второй, и т.д. параметры, переданные скрипту.
Если Вы их не указали - то они и будут пустыми.
Если Вы запускаете файл вручную, то, подозреваю, не передаете ему никаких параметров. :)
Спасибо, понял свою ошибку.
Тогда уж правильнее
ip route list dev br0 proto kernel scope link | awk '{print $1};'
192.168.1.0/24
Странно. У меня эта строчка возвращает, то же самое значение которое приходит в переменной $1. И потом почему $1? Ведь адрес внутреннего интерфейса содержится в $4
Спасибо, понял свою ошибку.
Странно. У меня эта строчка возвращает, то же самое значение которое приходит в переменной $1. И потом почему $1? Ведь адрес внутреннего интерфейса содержится в $4
Переменные awk и shell'a никак между собой не связаны.
Переменные awk и shell'a никак между собой не связаны.
Ничего не понял :(
Вообщем сейчас написал вот такой вот скриптик
#!/bin/sh
private=192.168.201.1
echo `ip route list dev br0 proto kernel scope link | awk '{print $private}'`
В итоге получаю все туже самую строку:
192.168.201.0/24 src 192.168.201.1
В итоге получаю все туже самую строку:
192.168.201.0/24 src 192.168.201.1
ну если
192.168.201.0/24 src 192.168.201.1
и
192.168.201.0/24
это одна и та же строка, то по моему все равно что писать в Вашем скрипте.
Может просто написать так?:
echo "192.168.201.0/24"
Оригинальный совет! Может быть тогда и программы например 1С-овские писать так, что у клиента может быть только один расчетный счет. А зачем больше то? А если хотите добавить, так вызовите програмиста он добавит :)
Повторюсь еще раз. Мне в скрипте post-firewall нужно получить адрес сети адаптера br0. Т.е. у меня адаптер имеет адрес 192.168.201.1. Адрес сети 192.168.201.0 с префиксом 24. Так вот как мне получить в скрипте строку 192.168.201.0/24 Не думаю, что это не возможно сделать. Подскажите пожалуйста!!!
вы хоть эту то тему с начала внимательно прочитайте. В ней приведена комманда, которая выдает именно то что вам надо.
вы хоть эту то тему с начала внимательно прочитайте.
Тему я прочитал очень внимательно. Но к сожалению ни одного варианта подходящего для меня нет. Во всех вариантах или к адресу/префиксу сети добавляется ненужный текст src 192.168.201.1 или необходимо указывать жестко префикс сети, а это для меня не допустимо. Извините за сравнение, но это все равно, что я в программе пропишу жестко БИК :confused: (можете пользоваться ребята несколькими расчетными счетами, но только в одном банке). Если же я пропустил этот вариант, то ткните пальцем. Да, я не специалист в никсах. Но неужели сложно подсказать решение и указать человеку на правильный и конечный вариант. Не для этого ли нужен коллективный разум :(
В любом случае, всем огромное спасибо!