PDA

View Full Version : Проблема с переменными


AlexeyN
26-02-2008, 21:06
WL-500g Premium, прошивка 1.9.2.7-8

Пишу в шелле echo $1 в ответ выводится пустая строка. Аналогично и для $2, $3, $4 и т.д.

Подскажите пожалуйста, в чем может быть проблема? Куда копать? Что еще можно проверить?

al37919
26-02-2008, 21:11
результат абсолютно правильный.
А что, собственно, мы ожидали увидеть то ???

AlexeyN
26-02-2008, 21:22
А что, собственно, мы ожидали увидеть то ???

Я так понимаю, что в ответ я должен увидеть имена и IP адреса интерфейсов. Например $3 - имя внутреннего интерфейса, а $4 - его адрес.

Я ошибаюсь? :confused:

lexass
26-02-2008, 21:41
Я ошибаюсь? :confused:
однозначно, да!

AlexeyN
26-02-2008, 21:49
Тогда подскажите, плиз, как в скрипте получить IP адрес адаптера br0.

На самом деле, мне необходимо в скрипте получить адрес сети адаптера br0 с префиксом. Т.е. например: 192.168.1.0/24

ЗЫ: Вообще странно, мне кажется даже Олег писал об этой возможности

al37919
26-02-2008, 21:51
:D
Это утверждение справедливо только для файла post-firewall
А вообще, почитайте что нибудь про переменные sh. Довольно подробное описание sh я встретил здесь: http://www.freebsd.org/cgi/man.cgi?query=sh&format=html

lexass
26-02-2008, 21:58
м.б. ifconfig поможет?

al37919
26-02-2008, 21:58
Получить 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"}'

djet
26-02-2008, 22:00
iplan=`/usr/sbin/ip -o -f inet addr show br0 | awk '{print $4;}'`

[routah:init.d] echo $iplan
192.168.1.1/24

AlexeyN
26-02-2008, 22:04
:D
справедливо только для файла post-firewall


Про него я и говорю. У меня выдало сообщение "адаптер не найден" Правда файл post-firewall я запускал вручную, но из /usr/local/sbin/. Проверю еще раз, может что накосячил. Спасибо!

А можно ли как преобразовать адрес интерфейса в адрес сети с префиксом? Или может быть можно получить его для post-firewall каким либо другим способом? Очень не хочется прописывать его жестко. Необходимо для того, чтоб прописать POSTROUTING в nat при старте OpenVPN клиента.

Понимаю что задача не тривиальная. Но хотелось бы настроить один раз и в случае смены айпи адресации не перенастраивать правила файреволла. Тем более, что роутер будет периодически мигрировать. Роутер будет использоваться для организации одной из точек большой РСПД. Знаю про скорость. В данной точке не критично

djet
26-02-2008, 22:11
А можно ли как преобразовать адрес интерфейса в адрес сети с префиксом?
На 1 сообщение выше.

al37919
26-02-2008, 22:18
djet :thumbs up: (тема апдейтится медленнее, чем предлагаются решения :) )
В общем ip в post-firewall --- $4, а вот субнет к ней --- наверное, см. на 2 поста выше.

AlexeyN
26-02-2008, 22:41
В общем ip в post-firewall --- $4, а вот субнет к ней --- наверное, см. на 2 поста выше.

Ох, знать бы еще, что всегда будет возможность использовать 24 маску. Подозреваю, что врядли :(


192.168.1.1/24


Так в итоге будет 192.168.1.1/24 или 192.168.1.0/24 ?

djet
26-02-2008, 22:48
А нужен адрес именно сети? Тогда так:

ip route list dev br0 scope link | awk '{print $1}'

AlexeyN
26-02-2008, 23:26
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

djet
26-02-2008, 23:52
Тогда уж правильнее
ip route list dev br0 proto kernel scope link | awk '{print $1};'
192.168.1.0/24

ABATAPA
27-02-2008, 06:44
Правда файл post-firewall я запускал вручную, но из /usr/local/sbin/.

Если Вы запускаете файл вручную, то, подозреваю, не передаете ему никаких параметров. :)

$1, $2, и т.д. - это не "волшебные" слова, которые подставляют то, что Вам нужно, а переменные, хранящие, соответственно, первый, второй, и т.д. параметры, переданные скрипту.
Если Вы их не указали - то они и будут пустыми.

AlexeyN
29-02-2008, 22:18
Если Вы запускаете файл вручную, то, подозреваю, не передаете ему никаких параметров. :)

Спасибо, понял свою ошибку.

Тогда уж правильнее
ip route list dev br0 proto kernel scope link | awk '{print $1};'
192.168.1.0/24

Странно. У меня эта строчка возвращает, то же самое значение которое приходит в переменной $1. И потом почему $1? Ведь адрес внутреннего интерфейса содержится в $4

djet
29-02-2008, 22:40
Спасибо, понял свою ошибку.



Странно. У меня эта строчка возвращает, то же самое значение которое приходит в переменной $1. И потом почему $1? Ведь адрес внутреннего интерфейса содержится в $4

Переменные awk и shell'a никак между собой не связаны.

AlexeyN
29-02-2008, 22:54
Переменные 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

al37919
01-03-2008, 00:56
В итоге получаю все туже самую строку:
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"

AlexeyN
01-03-2008, 17:17
Оригинальный совет! Может быть тогда и программы например 1С-овские писать так, что у клиента может быть только один расчетный счет. А зачем больше то? А если хотите добавить, так вызовите програмиста он добавит :)

Повторюсь еще раз. Мне в скрипте post-firewall нужно получить адрес сети адаптера br0. Т.е. у меня адаптер имеет адрес 192.168.201.1. Адрес сети 192.168.201.0 с префиксом 24. Так вот как мне получить в скрипте строку 192.168.201.0/24 Не думаю, что это не возможно сделать. Подскажите пожалуйста!!!

Oleg
01-03-2008, 17:24
ipcalc Вам в руки.

al37919
01-03-2008, 18:14
вы хоть эту то тему с начала внимательно прочитайте. В ней приведена комманда, которая выдает именно то что вам надо.

AlexeyN
02-03-2008, 00:14
вы хоть эту то тему с начала внимательно прочитайте.
Тему я прочитал очень внимательно. Но к сожалению ни одного варианта подходящего для меня нет. Во всех вариантах или к адресу/префиксу сети добавляется ненужный текст src 192.168.201.1 или необходимо указывать жестко префикс сети, а это для меня не допустимо. Извините за сравнение, но это все равно, что я в программе пропишу жестко БИК :confused: (можете пользоваться ребята несколькими расчетными счетами, но только в одном банке). Если же я пропустил этот вариант, то ткните пальцем. Да, я не специалист в никсах. Но неужели сложно подсказать решение и указать человеку на правильный и конечный вариант. Не для этого ли нужен коллективный разум :(

В любом случае, всем огромное спасибо!