PDA

Bekijk de volledige versie : Вопросы по скриптам на bash (shell)



Mam(O)n
16-02-2007, 15:30
Народ, кому не лень, проверьте работает ли у вас на роутере команда

echo "qwerty[i]" | /usr/bin/tr '[' ' '
или только у меня вылетает с segmentation fault?

cyrax
16-02-2007, 15:43
Народ, кому не лень, проверьте работает ли у вас на роутере команда

echo "qwerty[i]" | /usr/bin/tr '[' ' '
или только у меня вылетает с segmentation fault?

вылетает как и у вас

Mam(O)n
16-02-2007, 15:53
Замечательно... Точнее ничего замечательного нет. Придется теперь скрипты под sed переписывать ((
cyrax, спасибо за информацию.

cyrax
17-02-2007, 15:37
Замечательно... Точнее ничего замечательного нет. Придется теперь скрипты под sed переписывать ((
cyrax, спасибо за информацию.

Да незачто. Похоже что tr не переваривает [ ни в каком виде.
Могу помочь с sed / awk если что

Andromedaland
31-05-2007, 16:16
Вопрос оптимизации.

Имеется роутер WL500GP - самый быстрый в семействе, но далеко не каждое подобное устройство сможет конкурировать с настольным компьютером или ноутбуком в производительности. Поэтому важно "правильно" написать скрипт.

Понимаю что написание скриптов на shell большое искусство. Только знание и опыт могут превратить "километровый" код в "две строки" кода дающие тот же результат.

Первая задача - условно "найти различия".
Привожу пример скрипта (Листинг 1) который находит различия в двух списках и помещает её в файлы. Время выполнения скрипта на роутере WL500GP составляет - 240 секунд.



Листинг 1.

F_DIFF_LIST ()
{
cat /dev/null > $LIST_DEL
while read STR_OLD
do
grep -q $STR_OLD $LIST_NEW
if [ $? -eq 1 ]
then
echo "$STR_OLD" >> $LIST_DEL
fi
done <$LIST_OLD

cat /dev/null > $LIST_ADD
while read STR_ADD
do
grep -q $STR_NEW $LIST_OLD
if [ $? -eq 1 ]
then
echo "$STR_OLD" >> $LIST_DEL
fi
done <$LIST_NEW
}


Скрипт (Листинг 2) выполняет тоже самое, но выполняет это за 2 секунды.
Используется diff из diffutils - в результате существенная разница!!!
Задача выполнена.



Листинг 2.

F_DIFF_LIST ()
{
diff -a $LIST_NEW $LIST_OLD | grep ">" | awk '{ print $2 }' > $LIST_ADD
diff -a $LIST_NEW $LIST_OLD | grep "<" | awk '{ print $2 }' > $LIST_DEL
}


Вторая задача - условно "маршрутизация".
Скрипт (Листинг 3) выполняется 150 секунд - долго!!!
Выполненение задачи???



Листинг 3.

F_ROUTE_UAIX ()
{
while read IPUAIX
do
echo "$IPUAIX" | grep -q "/"
if [ $? -eq 0 ]
then
/sbin/route $PARAM -net $IPUAIX gw $GATEWAY
else
/sbin/route $PARAM -net $IPUAIX/$DEF_MASK gw $GATEWAY
fi
done <$UALIST
}


Подскажите как правильно написать скрипт "Листинг 3" чтобы он выполнялся быстрее.

---

owld
01-06-2007, 02:11
непонятно с какого хобота им выполнятся по две три минуты .

Что на фход то подается ? какие структуры ?

Andromedaland
01-06-2007, 09:16
непонятно с какого хобота им выполнятся по две три минуты .

Что на фход то подается ? какие структуры ?

---

Долго потому в файле $UALIST (он же ua-list.txt - прикреплен ниже) список из более чем 1800 сетей.

---

Подробно:

Роутер подключен к кабельному модему. Получает IP от DHCP провайдера №1. Поднимает VPN - провайдер №2. Понимает стену для разруливания трафика соглано списка $UALIST.

Переменные:

$UALIST - список IP адресов сетей входящих в UA-IX (файл ua-list.txt без 4-х верних строк)
$LIST_OLD - IP адреса предыдущего списка маршрутизации (старый $UALIST)
$LIST_NEW - IP адреса для текущего списка маршрутизации (новый $UALIST)
$LIST_DEL - IP адреса удалемые из списка маршрутизации (чтоб не переписывать весь список)
$LIST_ADD - IP адреса добавляемые к списку маршрутизации (чтоб не переписывать весь список)
$PARAM - опция "add" или "del"
$GATEWAY - шлюз провайдера №1 для текущего соединения
$DEF_MASK - маска по умолчанию

Список сетей входящих в UA-IX (файл ua-list.txt) переодически обновляеться (раз в 15 мин.). Количество сетей заметно растёт и за 1 год вырос придлизительно на 600 сетей.

При текущем количестве сетей (>1800) скрипт (Листинг 3) выполняется 150 секунд. При поднятии стены прописываеться полный список, а в последующем только разница. Пока время в 150 секунд - терпимо, а дальше? (список то растёт!!!)

Ести ли варианты прописать таблицу (список) маршрутизации быстрее???

---

Oleg
01-06-2007, 09:59
А bash пробовали использовать в качестве шелла?
В общем, чтобы было быстро, нужно написать на Си загрузку маршрутов...

Mam(O)n
01-06-2007, 10:18
Подскажите как правильно написать скрипт "Листинг 3" чтобы он выполнялся быстрее.

Попробуй, может awk быстрее будет обрабатывать. А самое лучшее решение - писать на C.


cat $UALIST | awk -F "/" -v PARAM=$PARAM -v GATEWAY=$GATEWAY -v DEF_MASK=$DEF_MASK '
/^[0-9].*/{
if ($2 != "") {
system("/sbin/route " PARAM " -net " $0 " gw " GATEWAY);
} else {
system("/sbin/route " PARAM " -net " $1 "/" DEF_MASK " gw " GATEWAY);
}
}'

Andromedaland
01-06-2007, 11:15
---

Благодарю.

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

---

Andromedaland
01-06-2007, 20:09
Попробуй, может awk быстрее будет обрабатывать.

---

Код с awk - время выполнения 105 секунд (1829 сетей).
105 с. < 150 с.
Лучше. Позже попробую на Си.

---

Duke
02-06-2007, 10:41
Докучи еще можно попробовать накатить перл и попробовать на нем. Может быстрее awk будет.

Andromedaland
06-06-2007, 10:51
Докучи еще можно попробовать накатить перл и попробовать на нем. Может быстрее awk будет.

---

Посмотрел исходник route.c - использование bash, awk, perl ... не даст требуемой эфективности. Нужно писать свой sroute (stream route).

---

vsu
06-06-2007, 20:10
Вообще в свежих версиях iproute2 команда ip имеет опцию -batch file, позволяющую за один вызов выполнить произвольное количество команд. Но в прошивке сейчас слишком старая версия, которая этого не умеет.

mkk
04-01-2008, 05:15
Дано:
Имеется файл, в котором записаны айпишники и названия узлов, например так:

88.88.88.88 RABOTA
77.77.77.77 FRIEND
11.11.11.11 CHINEESE_HACKER
Требуется:
Скрипт, который периодически просматривает системный лог и заменяет в нём эти айпишники на указанные названия из файла.

Скрипт планирую запускать через cron.
Если нужно, то структуру файла с названиями можно поменять.

Подскажите как сделать?

Duke
04-01-2008, 06:19
ключевое слово awk

ABATAPA
04-01-2008, 22:00
Дано:
Имеется файл, в котором записаны айпишники и названия узлов, например так:

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

Скрипт планирую запускать через cron.
Если нужно, то структуру файла с названиями можно поменять.

Подскажите как сделать?

Или учите awk, или поставьте bash / perl / и т.д., и напишите для них.
Неэффективный, но рабочий и простой вариант:



#!/bin/sh
cat /path/to/my/host_file | while read a b ; do sed -i "s/$a/$a\[$b\]/" /path/to/log_file ; done


Где
/path/to/my/host_file - Ваш файл с парами(!! - без пробелов в имени!) "IP HOST",
/path/to/log_file - лог-файл, в котором будут меняться(!) все вхождения первого слова на конструкцию "первое_слово[второе_слово]", что позволит видеть как IP, так и имя (к слову, порядок можно и поменять).
Пример:
Файл /tmp/my_hosts


210.5.162.47 SPAMMER_BOT


После запуска


cat /tmp/my_hosts | while read a b ; do sed -i "s/$a/$a\[$b\]/" /tmp/syslog.log | done


в файле будут строки вида:


Jan 4 23:24:46 dropbear[267]: Child connection from ::ffff:210.5.162.47[SPAMMER_BOT]:60320


Недостатки:
1. Файл будет открываться для изменения столько раз, сколько строк в в Вашем файле соответствия IP<->Имя.
2. Нет совместимых блокировок, поэтому одновременная запись syslogd и sed может привести к повреждениям файла. Как выход - работать с _копией_ файла.

angel_il
04-01-2008, 22:18
чтобы обойти недостаток №2 надо делать ротацию лога, потом в архивном логе заменять. Все это делать по крону.

mkk
04-01-2008, 22:34
спасибо, попробую поковыряться.

gdgsoft
05-01-2008, 14:49
Кстати, на подскажите по поводу скриптов на перле и запуска их автоматом при загрузке роутера?
Сам скрипт находится на флашке которая монтируется автоматом при загрузке стандартного ftp.
в post-mount идет монтирование флэшки в каталог /opt и собственно запуск скрипта.
и так, post-mount:
---
#!/bin/sh
/bin/mount -o bind,sync,noatime,rw /tmp/harddisk/opt /opt
/tmp/harddisk/opt/bin/gdg
---

монтирование, 2 строка, проходит... а вот третья судя по всему не хочет.
содержание файла gdg:
---
#!/bin/sh
/tmp/harddisk/opt/bin/ksbc
---

потом из файла ksbc запускается следующий скрипт :), следующим образом:
---
#!/bin/sh
cd /tmp/harddisk/ftp_pub/ksbc
perl ksbc1.pl
---

все эти прыжки по скриптам сделаны просто для первоначальной отладки и что бы не делать постоянно flashfs***. Просто из post-mount пускаю gdg, оттуда грузится ksbc, прыгаю в катало ksbc и оттуда запускаю саму прогу на перле путем: perl ksbc1.pl

дело в том, что если после перезагрузки роутера войти на него и просто выполнить скрипт набрав в строке post-mount, то все чудесным образом поднимается, а вот при загрузке роутера не хочет.
Помогите кто чем может! :)

al37919
05-01-2008, 15:20
во всех загрузочных скриптах везде используйте полные пути к исполняемым файлам.

gdgsoft
05-01-2008, 15:31
во всех загрузочных скриптах везде используйте полные пути к исполняемым файлам.

спасибо! я как раз этим и решил заняться!
И все получилось!
еще раз спасибо!

Megarem
09-01-2008, 17:51
Достаточно ли просто поправить /etc/passwd или нужно сделать еще какие-то действия? В сомнения вводит тот факт, что bash лежит на винте и не будет доступен, пока он не смонтируется.

angel_il
09-01-2008, 18:01
недостаточно, нужно еще прописать все доступные шелы в файл /etc/shells, если не подключится диск будет плохо! Нужен еще один резервный суперюзер, на такой случай.

dmig
10-01-2008, 00:20
недостаточно, нужно еще прописать все доступные шелы в файл /etc/shells, если не подключится диск будет плохо! Нужен еще один резервный суперюзер, на такой случай.

задавался вопросом баша, решил что опасно его руту давать.
лучше создать ещё одного юзера (дать ему sudo).

Mam(O)n
11-01-2008, 00:42
У меня такое решение в post-mount:


[ -x /opt/bin/bash ] && \
cat /etc/passwd | \
awk -F: '$7 ~ /^\/bin\/sh$/ {
if (!match($1,/-safe$/)) {
print $1":"$2":"$3":"$4":"$5":"$6":/opt/bin/bash";
print $1"-safe:"$2":"$3":"$4":"$5":"$6":/bin/sh";
}
else {
print $0
}
}
$7 !~ /^\/bin\/sh$/ {
print $0
}' | \
sort -r > /etc/passwd

Это при обнаружении /opt/bin/bash меняет всем юзерам системы (кроме тех у кого на конце -safe) шелл /bin/sh на /opt/bin/bash попутно создавая дублирующие аккаунты с постфиксом -safe с шеллом /bin/sh.

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

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

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

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

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

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

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

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

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

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

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

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

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

al37919
26-02-2008, 20: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, 21: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, 21:04
:D
справедливо только для файла post-firewall


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

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

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

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

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

AlexeyN
26-02-2008, 21: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, 21:48
А нужен адрес именно сети? Тогда так:


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

AlexeyN
26-02-2008, 22: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, 22:52
Тогда уж правильнее

ip route list dev br0 proto kernel scope link | awk '{print $1};'
192.168.1.0/24

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

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

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

AlexeyN
29-02-2008, 21: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, 21:40
Спасибо, понял свою ошибку.



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

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

AlexeyN
29-02-2008, 21: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
29-02-2008, 23: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"

Segen
01-03-2008, 10:13
Наткнулся на следущую проблему - из файла сценария не хотят выполняться встроенные команды sh, хотя из командной строки все замечательно работает (прошивка 1.9.2.7-8).
При выполнении сценария, например, с командой alias не выдается никаких результатов о существующих псевдонимах. Также если из файла выполнить, например, export а=3, то переменная окружения не добавляется. Но что странно встроенная shell-команда set из скрипта замечательно срабатывает и выдает список переменных окружения. Пробовал использовать вариант sh -c "export a=3" и sh -c "alias", результат тоже нулевой.
Кто-нибудь сталкивался с подобным и может подсказать в чем здесь дело?

angel_il
01-03-2008, 13:21
дело как правило в в неназначенных путях.


Также если из файла выполнить, например, export а=3
так и должно быть.
назначение переменных надо поместить в profile


Кто-нибудь сталкивался с подобным и может подсказать в чем здесь дело?

какого результата то хочется достичь?

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

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

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

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

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

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

Segen
02-03-2008, 12:32
Все, практический вопрос решения проблемы перетек в чисто теоретический интерес, т.к. все что надо я решил другим путем.

Кратко поясню. Я хотел запустить второй rtorrent, для этого нужен второй screen, но по какой-то причине screen's не хотели переключаться по их уникальным именам (задаваемым -S sessionname). Поэтому я решил переключаться на них по их pid-ам. А чтобы было удобнее пользоваться в скрипте решил написать что-то типа alias rt1="screen -r $pid1" и alias rt2="screen -r $pid2", не получилось. Тогда я решил эти алиасы убрать в profile, а в скрипт вставить export pid1 и export pid2, тоже не вышло. В результате я все же заставил их переключаться по заданным sessionname (до этого немного не так имена давал) и необходимость в экспорте переменных отпала.

Остался, как уже сказал, теоретический интерес, почему не все команды shell'а работают из сценариев?

al37919
02-03-2008, 13:34
При выполнении сценария, например, с командой alias не выдается никаких результатов о существующих псевдонимах
а они там есть?

При запуске неинтерактивных шелов ни ~/.profile , ни ~/.bashrc не выполняется. Так что откуда еще они возьмутся?

Если вы выполняете alias asdf=fsda , то это не создает system wide alias, а только alias, который живет в данном инстансе шела. После выхода из него он исчезает.

Если вы хотите использовать алиасы в скриптах --- их надо объявлять каждый раз в начале файла (или подгружать из спецфайла.

То же относится к export. У каждого процесса environment свой. Если вносятся изменения, то они относятся только к данному процессу и его детям.

Именно по этой причине отладка pre- /post- файлов может быть непростым делом. Они запускаются init имеют весьма примитивный environment, в частности HOME=/ ; PATH указывает только на встроенную squashfs и ничего из /opt не исполнить если не писать PATH или пути вручную, в то время как если эти файлы запускать вручную, то environment другой более полноценный.

Вы бы немного про шелл почитали --- я думаю, что Вы способны в этом разобраться ;)

Segen
02-03-2008, 14:12
Спасибо за объяснение, стало понятно что к чему, а шелл конечно надо изучить поглубже.

artp
16-03-2008, 19:43
Как на рутере управляется на каких консолях встречать shell'ом ?

Если я хочу, чтобы на /dev/tts/1 не было bash, куда и что прописать?
Если я добавлю usb-com, то куда прописать, чтобы там появился bash?

AntiMelk
05-04-2008, 21:48
Сразу хочу написать что у меня не wl500, а debian.
Произошло три зависания за полгода, последние два за месяц.

Выполнил:

apt-get update
apt-get upgrade

Через пару недель заметил, что удалённо не перезагружается...

router:~# reboot
-bash: /sbin/reboot: Input/output error

Кнопкой выключения не выключается.
После выключения питания всё работает какое-то время, потом всё с начала. Но каждый раз по-разному, иногда какие-то команды проходят иногда - нет, изредка даже ssh не работает, причём вылетает с разными ошибками.

По своему опыту я бы стал грешить на оперативную память... но здесь... Как-то это слишком быстро вышло из стороя, для памяти и специфика системы мне практически не знакома.

З.Ы. сеть, iptables и bridge работают всегда.

poizon
01-07-2008, 20:18
Приветствую Уважаемые
Помогите ответом
с помощью каких команд в оболочке bash можно получить то, что мы видим на это страничке http://192.168.1.1/Main_DHCPStatus_Content.asp
где 192.168.1.1 адрес роутера
большое спасибо всем кто поможет

Decaz
12-01-2009, 18:35
Установлен busybox версии 1.10.3-1, команда test урезанная донельзя, да и не только она. Уже всё, что можно обыскал, никак не могу найти исходники команды, помогите, пожалуйста :)

lly
12-01-2009, 18:43
Плохо искал - coreutils/test.c

Decaz
12-01-2009, 18:59
Это ведь файл из исходников busybox... Я ищу тот, что оригинальный, с многочисленными параметрами.

lly
12-01-2009, 19:04
А имя каталога ни о чем не напоминает :rolleyes:
это GNU coreutils - http://www.gnu.org/software/coreutils/

Decaz
12-01-2009, 20:03
Спасибо :)

al37919
12-01-2009, 20:46
если установить coreutils, то man test будет выдавать полноценный man

GUID
23-01-2009, 11:32
Добрый день,
хочется ловить "событие входа" на роутер из внешней сети (WAN) и запускать свой скрипт оповещения (вход через ssh, dropbear).
Можно конечно парсить лог-файл, но данное событие - редкое, а парсить придется раз в минуту... накладно.
Есть идеи?

P.S. wl-500gP, 10-ая Олеговская прошивка

GUID
26-01-2009, 13:26
Перефразирую вопрос:
нужно добавить в "профиль" пользователя (в данном случае root'а) автоматический вызов скрипта при входе (аналог "автозагрузки" в Windows).
Моя логика (человека слабо разбирающегося в linux): если мы можем прописать оболочку (т.е. фактически программу, вызываемую при входе) в passwrd, то наверное можно и прописать скрипт, вызываемый этой оболочкой до выдачи приглашения пользователю. Правильно?
А как это делается (где описана конфигурация под конкретного пользователя?)

P.S. оболочка стандартная (из Олеговской 10-ки), bash.

angel_il
26-01-2009, 13:41
Перефразирую вопрос:
нужно добавить в "профиль" пользователя (в данном случае root'а) автоматический вызов скрипта при входе (аналог "автозагрузки" в Windows).
Моя логика (человека слабо разбирающегося в linux): если мы можем прописать оболочку (т.е. фактически программу, вызываемую при входе) в passwrd, то наверное можно и прописать скрипт, вызываемый этой оболочкой до выдачи приглашения пользователю. Правильно?
А как это делается (где описана конфигурация под конкретного пользователя?)

P.S. оболочка стандартная (из Олеговской 10-ки), bash.

может это поможет...
http://wl500g.info/showthread.php?t=12357

angel_il
26-01-2009, 13:53
файл называется как правило profile

GUID
26-01-2009, 13:54
может это поможет...
"Пользуясь случаем" (с)
хочу выразить свою благодарность за microhowto. СПАСИБО!

Если вы имели ввиду запуск скрипта в конфигах putty - то это к сожалению не то, что хотелось.
А вариант с "а в ~/.profille добавить?" попробую вечером (сейчас нет доступа к роутеру), может это оно и есть...

skelet
01-03-2009, 07:55
хочу вставить такое в post-frewall


iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 42041 -j DNAT --to-destination 192.168.1.2:42041

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 42043 -j DNAT --to-destination 192.168.1.3:42043

iptables -I FORWARD -i ppp0 -p tcp -m tcp -d 192.168.1.2 --dport 42041 -j ACCEPT

iptables -I FORWARD -o ppp0 -p tcp -m tcp -s 192.168.1.3 --sport 42043 -j ACCEPT

awk '{ "ifconfig ppp0 | grep Mask" | getline a1
split(a1,a2,":"); split(a2[2],a3," ");
system("iptables -t nat -A POSTROUTING -p tcp -o ppp0 -s 192.168.1.2 --sport 42041 -SNAT --to-source " a3[1]);

system("iptables -t nat -A POSTROUTING -p tcp -o ppp0 -s 192.168.1.3 --sport 42043 -SNAT --to-source " a3[1]);
}'


Насколько это соответствует линии партии? В смысле поведение awk вызывает сомнения... почему-то на тестах она не выходит, а просто тупо ждёт нажатия enter и циклится

тест такой:
#!/bin/sh

awk '{ "ifconfig ppp0 | grep Mask" | getline a1;
split(a1,a2,":"); split(a2[2],a3," ");
system("echo " a3[1]);
split(a2[3], a4," ");
system("echo " a4[1]);
}'

echo "finished..."

al37919
01-03-2009, 08:55
однако, месье знает толк в извращениях

а так не проще будет:

iptables -A ... --to-source `ifconfig ppp0 | awk -F: '/Mask/{print $2}' | awk '{print $1}'`

а вообще то ip адрес WAN в post-firewall передается вторым параметром. Так что еще более упрощая:

iptables -A ... --to-source $2

skelet
01-03-2009, 08:59
а вообще то ip адрес WAN в post-firewall передается вторым параметром. Так что еще более упрощая:

iptables -A ... --to-source $2
во, именно это было и надо!
Просто я вывел все параметры пост-файрволла в syslog, тока ppp0 обнаружил ) поэтому и решил парсить его через ifconfig

неа , сделал вот так - ничего не работает


iptables -I FORWARD -i $7 -p tcp -m tcp -d 192.168.1.2 --dport 42041 -j ACCEPT
iptables -I FORWARD -o $7 -p tcp -m tcp -s 192.168.1.2 --sport 42041 -j ACCEPT
iptables -t nat -A POSTROUTING -p tcp -o $7 -s 192.168.1.2 --sport 42041 -j SNAT --to-source $2
точнее так - utorrent пишет что всё шоколадно, в то время как http://utorrent.com/testport.php?port=42041 говорит о закрытом порте... (((

помогите плз советом если не в лом

StaREViL
01-03-2009, 14:23
неа , сделал вот так - ничего не работает


awk тут не причем.


iptables -I INPUT -p tcp --dport 42041 -j ACCEPT
iptables -I INPUT -p udp --dport 42041 -j ACCEPT

skelet
01-03-2009, 14:52
согласен, но цепочка INPUT ещё менее при чём ))

Проблема решена - просто фф был шибко умный, кэшировал запрос :D:D

voidshah
05-05-2011, 17:27
Плз., подскажите, можно ли в shell-скриптах использовать массивы? Или такой возможности для bash в прошивках нет?! Может вопрос и поднимался - да не нашел...

ConstAntz
05-05-2011, 17:48
Плз., подскажите, можно ли в shell-скриптах использовать массивы? Или такой возможности для bash в прошивках нет?! Может вопрос и поднимался - да не нашел...

Мои попытки успехом не увенчались. В awk - получилось.

voidshah
05-05-2011, 18:53
Спс, будем страдать с awk:(
offtop Может кто букварь нормальный по нему подскажет?

ConstAntz
05-05-2011, 19:01
Спс, будем страдать с awk:(
offtop Может кто букварь нормальный по нему подскажет?
держи букварь - http://ss64.com/bash/ ;)

KRandall
17-09-2012, 11:53
Доброго времени суток

Помогите пожалуйста с решением небольшой задачи

Из файлов, сгруппированных по префиксу 'Имя.html' (до первого знака '-', выделено синим) оставить один (самый свежий, если сгруппировано более одного файла)
# ls -la
admin admin 85049 2012-09-15 23:35 Another.html-gzip-2883620-1043150-1347607303
admin admin 85049 2012-09-16 02:28 Another.html-gzip-2883620-1043150-1347745318
admin admin 68377 2012-09-15 23:36 Begin.html-gzip-2883711-354959-1347737586
admin admin 31600 2012-09-15 23:36 Content.html-gzip-2883623-424402-1347737434
admin admin 46154 2012-09-14 12:20 Content.html-gzip-2883623-475162-1347607301
admin admin 1707728 2012-09-16 13:33 Double.html-gzip-2883672-9165565-1347787944
admin admin 1707182 2012-09-14 12:19 File.html-gzip-2883673-9163898-1347601490
admin admin 1682905 2012-09-15 23:33 File.html-gzip-2883673-9141871-1347737585
admin admin 1708533 2012-09-15 23:24 File.html-gzip-2883673-9165565-1347736998
admin admin 1707728 2012-09-13 02:37 File.html-gzip-2883673-9165565-1347745334Должно остаться:
# ls -la
admin admin 85049 2012-09-16 02:28 Another.html-gzip-2883620-1043150-1347745318
admin admin 68377 2012-09-15 23:36 Begin.html-gzip-2883711-354959-1347737586
admin admin 31600 2012-09-15 23:36 Content.html-gzip-2883623-424402-1347737434
admin admin 1707728 2012-09-16 13:33 Double.html-gzip-2883672-9165565-1347787944
admin admin 1682905 2012-09-15 23:33 File.html-gzip-2883673-9141871-1347737585

В написании скриптов не очень силён, алгоритмы в голове есть, но не знаю, каким инструментом их реализовать. Поиск результатов не дал.

P.S. Предполагается запускать из cron. На входе скрипта - путь к каталогу, с которого начинать обработку. Для универсальности хорошо бы сделать рекурсивную обработку подкаталогов

Спасибо

Asgard
17-09-2012, 12:23
Глянь тут
http://pfzim.narod.ru/rotate/index.html

KRandall
17-09-2012, 12:36
Спасибо, но это немного не то.

В моём случае префикс у файлов разный, даты создания в имени файла нет и еще нужен какой-то механизм выбора файла по дате создания из группы файлов с одним префиксом

Вот например такой алгоритм.
Выводим список файлов в каталоге с помощью tree (сортируем по дате создания по убыванию - tree -D -N -C -t -i -o tree.txt каталог)
[Sep 16 13:33] Double.html-gzip-2883672-9165565-1347787944
[Sep 16 02:28] Another.html-gzip-2883620-1043150-1347745318
[Sep 15 23:36] Begin.html-gzip-2883711-354959-1347737586
[Sep 15 23:36] Content.html-gzip-2883623-424402-1347737434
[Sep 15 23:35] Another.html-gzip-2883620-1043150-1347607303
[Sep 15 23:33] File.html-gzip-2883673-9141871-1347737585
[Sep 15 23:24] File.html-gzip-2883673-9165565-1347736998
[Sep 14 12:20] Content.html-gzip-2883623-475162-1347607301
[Sep 14 12:19] File.html-gzip-2883673-9163898-1347601490
[Sep 13 02:37] File.html-gzip-2883673-9165565-1347745334Далее делаем цикл по записям файла tree.txt.
Первая запись (Double.html). Файлов с таким префиксом в цикле не находим - ничего не делаем.
Вторая запись (Another.html). Находим файл с таким же префиксом в 5-й записи, удаляем файл с этим именем и удаляем записи с найденным префиксом из файла tree.txt.
Третья запись (Begin.html). Файлов с таким префиксом в цикле не находим - ничего не делаем.
Четвёртая запись (Content.html). Находим файл с таким же префиксом в 8-й записи, удаляем файл с этим именем и удаляем записи с этим префиксом из файла tree.txt.
(Пятая запись (Another.html) - удалена на втором шаге).
Пятая запись (File.html). Находим еще 3 файла с таким же префиксом, удаляем их и удаляем записи с этим префиксом из файла tree.txt.
и т. д.

Остаётся желаемое
[Sep 16 13:33] Double.html-gzip-2883672-9165565-1347787944
[Sep 16 02:28] Another.html-gzip-2883620-1043150-1347745318
[Sep 15 23:36] Begin.html-gzip-2883711-354959-1347737586
[Sep 15 23:36] Content.html-gzip-2883623-424402-1347737434
[Sep 15 23:33] File.html-gzip-2883673-9141871-1347737585

Вот как-то так. Не умею реализовать это с помощью команд linux

ABATAPA
17-09-2012, 13:06
Помогите пожалуйста с решением небольшой задачи


Помогаю: есть find, есть ls с ключем '-t'
Далее, надеюсь, понятно.

KRandall
17-09-2012, 13:33
Если не затруднит, чуть подробнее. Пока не пойму, как с помощью этих команд слепить нужный алгоритм
Хотя бы в общих чертах по шагам

ABATAPA
17-09-2012, 14:05
Если не затруднит, чуть подробнее. Пока не пойму, как с помощью этих команд слепить нужный алгоритм
Хотя бы в общих чертах по шагам

Знаете, учить - сложнее, чем делать самому.
В архиве тестовые файлы, и скрипт на perl.

9273

Orex
17-09-2012, 15:59
#!/bin/sh

DIR="$1"

for file in `ls -1 $DIR | grep '^.*html-.*$'`
do

name=`echo "$file" | awk -F "-" '{print $1}'`

for subfile in `ls -t $DIR | grep ^$name-.*\$ | sed '1d'`
do
rm ${DIR}/${subfile}
done

done

exit 0;

ABATAPA
17-09-2012, 17:24
[code]#!/bin/sh
do
rm ${DIR}/${subfile}
done


2. Этот код не будет работать с пробелами в именах файлов или каталогов.

KRandall
17-09-2012, 19:09
#!/bin/sh

DIR="$1"

for file in `ls -1 $DIR | grep '^.*html-.*$'`
do

name=`echo "$file" | awk -F "-" '{print $1}'`

for subfile in `ls -t $DIR | grep ^$name-.*\$ | sed '1d'`
do
rm ${DIR}/${subfile}
done

done

exit 0;

Спасибо, работает

А как сделать рекурсию по вложенным каталогам?

ABATAPA
17-09-2012, 19:20
В архиве тестовые файлы, и скрипт на perl.


Версия для Perl < 5.11 (в частности для Perl из текущего entware/optware):
9274

Скрипт только печатает имена "нужных" файлов, не удаляя "лишние"!
Чтобы удалять, нужно добавить одну строчку... ;)

Для рекурсивного обхода каталогов можно использовать `find -exec':

find /dir -type d -exec /path/to/parse-mipsel.pl {} \;

Orex
18-09-2012, 08:02
2. Этот код не будет работать с пробелами в именах файлов или каталогов.


#!/bin/sh

DIR="$1"

for file in `ls -1 "$DIR" | grep '^.*html-.*$' | sed 's/ /~~~bs~~~/g'`
do

name=`echo "$file" | awk -F "-" '{print $1}'`

for subfile in `ls -t "$DIR" | grep ^$name-.*\$ | sed -e '1d' -e 's/ /~~~bs~~~/g'`
do
rm "${DIR}/`echo "${subfile}" | sed 's/~~~bs~~~/ /g'`"
done

done

exit 0;



А как сделать рекурсию по вложенным каталогам?
Про рекурсию уже написали:



find <корневой каталог> -type d -exec <путь к скрипту> {} \;

и в таком духе...

staticroute
18-09-2012, 13:58
#!/bin/sh

DIR="$1"

for file in `ls -1 "$DIR" | grep '^.*html-.*$' | sed 's/ /~~~bs~~~/g'`
do

name=`echo "$file" | awk -F "-" '{print $1}'`

for subfile in `ls -t "$DIR" | grep ^$name-.*\$ | sed -e '1d' -e 's/ /~~~bs~~~/g'`
do
rm "${DIR}/`echo "${subfile}" | sed 's/~~~bs~~~/ /g'`"
done

done

exit 0;


Жесть..

Проще добавить IFS=$'\n' перед первым циклом...

KRandall
19-09-2012, 13:41
Да, Orex, скрипт работает, и рекурсия тоже. Спасибо за помощь

P.S. Нужно было для удаления устаревших сжатых файлов из кэша lighttpd (с использованием mod_compress).
Изменил префикс с
for file in `ls -1 "$DIR" | grep '^.*html-.*$' | sed 's/ /~~~bs~~~/g'`на
for file in `ls -1 "$DIR" | grep '^.*gzip-.*$' | sed 's/ /~~~bs~~~/g'`так как сжимаются не только html, но и другие файлы.

При частом обновлении контента web-сервера конечно же полезно. Подробнее тут (http://wl500g.info/showthread.php?9091-%C8%ED%F1%F2%E0%EB%FF%F6%E8%FF-%E8-%ED%E0%F1%F2%F0%EE%E9%EA%E0-lighttpd&p=254947#post254947)

belmont
21-10-2012, 19:30
увы с Linux не знаком, но хотелось бы для удобства сохранить парочку скриптов в домашнем каталоге ~ root
чтобы при логине сразу их выполнить.
При выключении\перезагрузке роутера из домашней папки все файлы стираются

переходить же постоянно на примонтированную флешку - лишние комманды(не удобно набирать с телефона)
подскажите пожалуйста, почему удаляются файлы из домашней папки и как это победить ?

MMX2
21-10-2012, 20:00
увы с Linux не знаком, но хотелось бы для удобства сохранить парочку скриптов в домашнем каталоге ~ root
чтобы при логине сразу их выполнить.
При выключении\перезагрузке роутера из домашней папки все файлы стираются

переходить же постоянно на примонтированную флешку - лишние комманды(не удобно набирать с телефона)
подскажите пожалуйста, почему удаляются файлы из домашней папки и как это победить ?


Читать, читать и читать данный форум!!!
1.
flashfs save && flashfs commit && flashfs enable
2.Проверить, что в выдаче есть tmp/local/root/
3. Радоваться.
4. Если нет - грустить. А потом, добавить нужную папку в /tmp/local/.files, потом

flashfs save && flashfs commit && flashfs enable
и вот теперь уж точно радоваться.
P.S. Если скрипт кинуть в /opt/bin то он будет легко вызываться по своему названию.

belmont
22-10-2012, 02:55
Читать, читать и читать данный форум!!!
flashfs save && flashfs commit && flashfs enable[/PHP]

Прошу прощения - пытался найти поиском, почитал первые 8 страниц не нашел,
по вашему ответу погуглил данные клманды многое узнал
все работает, спасибо большое

staticroute
23-11-2012, 22:08
интересный прикол, если изменить шелл на bash, то по ssh не пускает:


ssh router
admin@router's password:
Permission denied, please try again.
admin@router's password:


при этом по телнет прекрасно заходит:

~ $ telnet router
Trying 192.168.1.1...
Connected to router.
Escape character is '^]'.
router login: admin
Password:
router:~ $


UPDATE: разобрался, нужно сделать файл /etc/shells и туда сунуть:

/opt/bin/bash
/bin/sh

надеюсь кому-либо пригодится данный tip

Zyxmon
24-11-2012, 06:11
UPDATE: разобрался, нужно сделать файл /etc/shells и туда сунуть:

/opt/bin/bash
/bin/sh

надеюсь кому-либо пригодится данный tip
При установке пакета такое должно по идее прописываться.

ryzhov_al
24-11-2012, 07:44
При установке пакета такое должно по идее прописываться.Должно, конечно. Но мы не может тянуть свои костлявые ручищи к чему-либо за пределами папки /opt, во избежание внезапных глюков на различных прошивках.

Zyxmon
24-11-2012, 09:00
Должно, конечно. Но мы не может тянуть свои костлявые ручищи к чему-либо за пределами папки /opt, во избежание внезапных глюков на различных прошивках.
А у меня специально dropbear пропатчен, чтобы нужный файл shells брать. Тут это возможно?

staticroute
24-11-2012, 12:35
Должно, конечно. Но мы не может тянуть свои костлявые ручищи к чему-либо за пределами папки /opt, во избежание внезапных глюков на различных прошивках.

да, все верно, так как используется dropbear из прошивки, он тягает файлы из /etc, поэтому все как бы логично.

если установить dropbear в /opt или openssh думаю он создаст нужные файлы в принципе.

я сделал просто - добавил /etc/shells в /usr/local/.files и меняю шелл пользователю в /etc/passwd после того, как замаунтилась флешка.

ryzhov_al
24-11-2012, 14:13
Zyxmon, staticroute, даже не знаю, будет ли правильным создавать в /opt/etc свой собственный ./shells.

staticroute
24-11-2012, 14:30
Zyxmon, staticroute, даже не знаю, будет ли правильным создавать в /opt/etc свой собственный ./shells.

а что? вполне логично для пакетов, поставленных в entware, они же все с префиксом /opt, поэтому dropbear или openssh должен будет читать именно из /opt/etc/shells, но тогда и /opt/etc/passwd должен использовать вместо /etc/passwd.

Zyxmon
25-11-2012, 04:34
а что? вполне логично для пакетов, поставленных в entware, они же все с префиксом /opt, поэтому dropbear или openssh должен будет читать именно из /opt/etc/shells, но тогда и /opt/etc/passwd должен использовать вместо /etc/passwd.
Неоднозначно тут. У себя на кинетике я был вынужден так сделать для dropbear, т.к. Нет записи в /etc. А в проекте Entware - скорее всего это не стоит делать. Нужные патчи dropbear у меня есть, если потребуются.
Можно, наверное, и на уровне uCllibC сделать изменения, последствия этого ..... ?????

KRandall
25-04-2013, 18:51
Доброго времени суток, уважаемые форумчане.

Есть вот такой скрипт, работает с рекурсией по каталогам
#!/bin/sh

DIR="$1"

re_match="1251"
replace="html"

for i in $( ls -A $DIR/*1251 );
do
src=$i
tgt=$(echo $i | sed -e "s/$re_match/$replace/")
iconv -f CP1251 -t UTF-8 $src > $tgt
done
rm $DIR/*1251 >/dev/nullПомогли сделать его здесь, на форуме. Хоть в bash-е не особо, но понимаю, что в каталоге берутся все файлы с расширением .1251 и затем iconv-ом расширение меняется на .html

Помогите пожалуйста реализовать следующее. То, что реализовано, остается без изменений + добавляется:

К исходным файлам с расширением .1251 добавляется расширение .html (file.1251 -> file.1251.html)
и внутри каждого полученного .1251.html-файла меняется последовательность 'utf-8' на 'win-1251'.

С помощью sed-а все получается, но не знаю, как это сделать в цикле...

P.S. Файлы .1251 наверное лучше сразу переименовывать в .1251.html чтобы потом их не удалять командой rm $DIR/*1251 >/dev/null

ConstAntz
25-04-2013, 23:48
С помощью sed-а все получается, но не знаю, как это сделать в цикле...


После смены кодировки не торопитесь отправлять результат в новый файл, сперва подредактируйте его
iconv -f CP1251 -t UTF-8 $src | sed -e 's/utf-8/win-1251/' >$tgt

KRandall
26-04-2013, 12:38
После смены кодировки не торопитесь отправлять результат в новый файл, сперва подредактируйте его
iconv -f CP1251 -t UTF-8 $src | sed -e 's/utf-8/win-1251/' >$tgt
Если правильно понял, то предложенное решение не подходит.
При смене кодировки происходит то, что нужно:
iconv -f CP1251 -t UTF-8 $src > $tgt- у файла с расширением .1251 оно заменяется на расширение .html, внутри меняется кодировка, но не должен меняться тэг с 'utf-8'.

Нужно сделать вот что:
sed -e 's/utf-8/win-1251/' $src > $tgt_1, где
$src - это исходный файл с расширением .1251;
$tgt_1 - это файл, который образуется из исходного файла с расширением .1251 путем добавления к нему расширения .html и заменой внутри тэга utf-8 на win-1251
Исходные файлы:
...File_1.1251
...File_2.1251
...Сейчас есть такой результат работы скрипта (файлы перекодированы iconv):
...File_1.html
...File_2.html
...А нужно перед удалением файлов .1251 поменять внутри utf-8 на win-1251 и прибавить к ним расширение .html, а потом уже удалять rm $DIR/*1251 >/dev/null
...File_1.1251.html (получен из File_1.1251)
...File_1.html
...File_2.1251.html (получен из File_1.1251)
...File_2.html
...

P.S. Понимаю, что в скрипт нужно вставить строку типа
#!/bin/sh

DIR="$1"

re_match="1251"
replace="html"

for i in $( ls -A $DIR/*1251 );
do
src=$i
tgt=$(echo $i | sed -e "s/$re_match/$replace/")
iconv -f CP1251 -t UTF-8 $src > $tgt

sed 's/utf-8/win-1251/' $src > $src + `.html`

done
rm $DIR/*1251 >/dev/nullВыделенное жирным не знаю как правильно записать

ВОПРОС СНЯТ
Вот рабочий вариант нового скрипта (выделенно - добавленное мною)
#!/bin/sh

DIR="$1"

re_match="1251"
replace="html"
ext_add=".html"

for i in $( ls -A $DIR/*1251 );
do
src=$i
tgt=$(echo $i | sed -e "s/$re_match/$replace/")
iconv -f CP1251 -t UTF-8 $src > $tgt
sed 's/utf-8/win-1251/' $src > $src$ext_add
done
rm $DIR/*1251 >/dev/null

Choice
27-06-2013, 09:00
Подскажите как можно установить bash в качестве шелла по умолчанию.
Роутер Asus wl500. Утилиты которые помогали на прошивке от Олега, после
перехода на Entware, отсутствуют.
Заранее благодарен.

ryzhov_al
27-06-2013, 09:10
Утилиты которые помогали на прошивке от Олега, после
перехода на Entware, отсутствуют..Какие утилиты?

Choice
27-06-2013, 09:37
Например adduser, pwgen и тому подобные.
Которые позволяют изменять данные пользователей
и прочее

ryzhov_al
27-06-2013, 11:39
Например adduser,
shadow-useradd
shadow-userdel
shadow-usermod

pwgen
shadow-passwd

и тому подобные.
Которые позволяют изменять данные пользователей
и прочее
shadow-groupadd
shadow-groupdel
shadow-groupmod
shadow-groups

Choice
27-06-2013, 12:19
Спасибо, но почему то после установки shadow, sh пишет что shadow отсутствует
Мне вообще нужно в passwd сменить шелл. может есть другой способ?

ryzhov_al
27-06-2013, 12:21
shadow — это метапакет. Устанавливайте конкретные утилиты из его состава, имена пакетов перечислены выше.

Choice
27-06-2013, 12:27
Так он их вроде сам притянул при установке. И написал что их все сконфигурировал.
usermod -s /bin/bash root почему то не менят шелл

ryzhov_al
21-12-2013, 16:46
Посмотрите какая изюмительная вещь (http://explainshell.com/): вы вписываете в поле кусок shell-скрипта, а сайт объясняет вам что этот кусок делает.

rss
22-12-2013, 07:22
Посмотрите какая изюмительная вещь (http://explainshell.com/): вы вписываете в поле кусок shell-скрипта, а сайт объясняет вам что этот кусок делает.

Для новичков это бывает очень полезно. Оно еще и автоматически пытается прочитать параметры из man...

Barquero
19-12-2014, 14:16
Добрый день
Подскажите скрипт для проверки программы на запущенность.
Трансмиссия падает иногда, не всегда есть возможность ручками перезапустить.
Как скриптом через крон проверять? И при необходимости запускать...

RTFM --> http://wl500g.info/showthread.php?2391-FAQ-%D7%E0%F1%F2%EE-%E7%E0%E4%E0%E2%E0%E5%EC%FB%E5-%E2%EE%EF%F0%EE%F1%FB&p=191838#post191838

mbg
19-12-2014, 20:00
Добрый день
Подскажите скрипт для проверки программы на запущенность.
Трансмиссия падает иногда, не всегда есть возможность ручками перезапустить.
Как скриптом через крон проверять? И при необходимости запускать...
Скрипт не знаю, сам пользую программу monit.

AndreyPopov
20-12-2014, 08:46
Добрый день
Подскажите скрипт для проверки программы на запущенность.
Трансмиссия падает иногда, не всегда есть возможность ручками перезапустить.
Как скриптом через крон проверять? И при необходимости запускать...



воспользуйтесь такой командой

ps | grep -c transmission

она посчитает сколько раз в запущенных процессах встречается transmission

есть только один нюанс, сама команда ps | grep -c transmission тоже будет в списке процессов, т.е. число всегда будет как минимум 1

if [ `ps | grep -c transmission` -le 1 ]; than

Barquero
21-12-2014, 11:28
воспользуйтесь такой командой

ps | grep -c transmission

она посчитает сколько раз в запущенных процессах встречается transmission

есть только один нюанс, сама команда ps | grep -c transmission тоже будет в списке процессов, т.е. число всегда будет как минимум 1

if [ `ps | grep -c transmission` -le 1 ]; than

Написал вот такой скрипт

#!/bin/sh
if [ `ps | grep -c transmission` -ge 4 ]; then
echo Transmission work
exit
else
/opt/etc/init.d/S99trans start
fi
exit

Но так как мастерства нет :), то он не проверяет почему то количество запущенных трансмиссий (их 5, как минимум, по подсчёту ps | grep -c transmission), а запускает очередную пачку.
Как поправить?

AndreyPopov
21-12-2014, 11:58
оба exit - это лишнее!

Barquero
21-12-2014, 14:22
Второй Exit выкинул, Всё равно не работает.

не срабатывает подсчёт if [ `ps | grep -c transmission` -le 1 ] или if [ `ps | grep -c transmission` -ge 4 ],
просто выполняется то, что после then.

AndreyPopov
21-12-2014, 14:47
Второй Exit выкинул, Всё равно не работает.

не срабатывает подсчёт if [ `ps | grep -c transmission` -le 1 ] или if [ `ps | grep -c transmission` -ge 4 ],
просто выполняется то, что после then.

еще раз повторю - exit вообще не нужны! откуда вы их взяли?

да ";" уберите после квадратных скобок

можно попробовать еще так

Trans=`ps | grep -c transmission`
if [ $Trans -le 1 ] then

Barquero
21-12-2014, 15:39
#!/bin/sh
Trans=`ps | grep -c transmission`
if [ $Trans -ge 4 ]
then
echo Transmission
else
/opt/etc/init.d/S99trans start
fi

К сожалению ИФ не работает, выполняет инструкцию после Then и всё.

MercuryV
21-12-2014, 17:56
Уважаемые велосипедостроители, а чем не устроил вариант, на который Omega сразу указал?

Barquero
22-12-2014, 15:14
Уважаемые велосипедостроители, а чем не устроил вариант, на который Omega сразу указал?
А что за вариант от Омеги?

MercuryV
22-12-2014, 23:22
Посмотрите свой пост с вопросом. Туда же добавлен ответ

Barquero
23-12-2014, 15:35
:confused: Плохо быть невнимательным, валосапед то оказываеццо давно изобретён...