Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, всегда пожалуйста и наверняка все можно, только я ничего уже не помню!  Что там является проверкой, что нужно запараллелить?  Тело цикла while read INIFILE; do ... done?
 
Ну, в простейшем случае как-то так:
 

Код:
#!/bin/bash
 
# config
DIR="/archive/obj/cssap"
 
# coloring
RED="$(tput setaf 1)"
GREEN="$(tput setaf 2)"
CYAN="$(tput setaf 6)"
SGR0="$(tput sgr0)"
BOLD="$(tput bold)"
 
echo "NIoP --> No instance on port"
echo "WIoP --> Wrong instance on port"
echo "${BOLD}${CYAN}STATUS ARCHWIN_PORT WEBPORT INSTANCE${SGR0}"
 
while read INIFILE; do (
    while read KEY VALUE; do
        case $KEY in
            'ARCHWIN_PORT')
                ARCHWIN_PORT="$VALUE"
                ;;
            'WEBPORT')
                WEBPORT="$VALUE"
                ;;
        esac
    done < "$INIFILE"
 
    STATUS="${GREEN}    OK${SGR0}"
    read PID __ < <(fuser 2>&- "${ARCHWIN_PORT}/tcp")
    INIFILE="${INIFILE##*/}"
    if [[ -z $PID ]]; then
        # No instance on port
        STATUS="${RED}${BOLD}  NIoP${SGR0}"
    else
        read CMD < <(ps -p "$PID" -o cmd=)
        [[ $CMD == *$INIFILE ]] ||\
            # Wrong instance on port
            STATUS="${RED}${BOLD}  WIoP${SGR0}"
    fi
 
    printf '%s %12s %7s %s\n' \
           "${STATUS}" \
           "${ARCHWIN_PORT}" \
           "${WEBPORT}" \
           "${INIFILE}"
) & done < \
     <(find "$DIR" -type f -regex '.*archint\.ini\.[^.]+')
wait

 
Подоболочка () &, ага.
 
> И еще хотелось бы, чтобы ошибки фильтровались ( grep -v "OK" ? ) и высылались на маил или просто выводились на консоль
 
Вот это вообще не понял.  А сейчас они куда выводятся?


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:37 19-02-2016 | Исправлено: ASE_DAG, 20:48 19-02-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сейчас оно все выводит на консоль:
 
   OK        13000   33000 archint.ini.FCP_A
    OK        13020   33020 archint.ini.FCP_O
    OK        12450   32450 archint.ini.NSP_BA_F1
    OK        20180   40180 archint.ini.NCP_C
    OK        12980   32980 archint.ini.ZGP_IM_N
    OK        11230   31230 archint.ini.HB0_Z

 
Спасибо! Стало гораздо быстрей - ~30секунд вместо ~5 минут. Может как-то через xargs можно еще рапараллелить проверки?
 

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:58 22-02-2016 | Исправлено: CrownRU, 11:14 22-02-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU> Спасибо! Стало гораздо быстрей - ~30секунд вместо ~5 минут.
 
Пожалуйста.  Я правда удивлен, что оно так медленно работало — вы бы сразу сказали.  Да и сейчас здесь определенно есть простор для оптимизации, я правда пока уверен в локализации узкого места, но хотя бы от массовых дерганий ps, я думаю, избавиться точно не помешает:
 

Код:

#!/bin/bash
 
# config
DIR="/archive/obj/cssap"
 
# coloring
RED="$(tput setaf 1)"
GREEN="$(tput setaf 2)"
CYAN="$(tput setaf 6)"
SGR0="$(tput sgr0)"
BOLD="$(tput bold)"
 
echo "NIoP --> No instance on port"
echo "WIoP --> Wrong instance on port"
echo "${BOLD}${CYAN}STATUS ARCHWIN_PORT WEBPORT INSTANCE${SGR0}"
 
while read pid cmd; do
    CMD[$pid]="$cmd"
done < \
     <(ps -e -ww -o pid= -o cmd= | grep 'archint.ini')
 
while read INIFILE; do (
    while read KEY VALUE; do
        case $KEY in
            'ARCHWIN_PORT')
                ARCHWIN_PORT="$VALUE"
                ;;
            'WEBPORT')
                WEBPORT="$VALUE"
                ;;
        esac
    done < "$INIFILE"
 
    STATUS="${GREEN}    OK${SGR0}"
    read PID __ < <(fuser 2>&- "${ARCHWIN_PORT}/tcp")
    INIFILE="${INIFILE##*/}"
    if [[ -z $PID ]]; then
        # No instance on port
        STATUS="${RED}${BOLD}  NIoP${SGR0}"
    else
        [[ ${CMD[$PID]} == *$INIFILE ]] ||\
            # Wrong instance on port
            STATUS="${RED}${BOLD}  WIoP${SGR0}"
    fi
 
    printf '%s %12s %7s %s\n' \
           "${STATUS}" \
           "${ARCHWIN_PORT}" \
           "${WEBPORT}" \
           "${INIFILE}"
) & done < \
         <(find "$DIR" -type f -regex '.*archint\.ini\.[^.]+')
wait

 
Хотя бес его знает — проверьте.
 
> Сейчас оно все выводит на консоль
 
Да я как бы в курсе.  А надо-то что?  Не выводить строчки с «OK» вовсе?  Ну, очевидно, как-то так:
 

Код:

#!/bin/bash
 
# config
DIR="/archive/obj/cssap"
 
# coloring
RED="$(tput setaf 1)"
GREEN="$(tput setaf 2)"
CYAN="$(tput setaf 6)"
SGR0="$(tput sgr0)"
BOLD="$(tput bold)"
 
echo "NIoP --> No instance on port"
echo "WIoP --> Wrong instance on port"
echo "${BOLD}${CYAN}STATUS ARCHWIN_PORT WEBPORT INSTANCE${SGR0}"
 
while read pid cmd; do
    CMD[$pid]="$cmd"
done < \
     <(ps -e -ww -o pid= -o cmd= | grep 'archint.ini')
 
while read INIFILE; do (
    while read KEY VALUE; do
        case $KEY in
            'ARCHWIN_PORT')
                ARCHWIN_PORT="$VALUE"
                ;;
            'WEBPORT')
                WEBPORT="$VALUE"
                ;;
        esac
    done < "$INIFILE"
 
    STATUS='OK'
    STATUS_COLORED="${GREEN}    OK${SGR0}"
    read PID __ < <(fuser 2>&- "${ARCHWIN_PORT}/tcp")
    INIFILE="${INIFILE##*/}"
    if [[ -z $PID ]]; then
        # No instance on port
        STATUS='NIoP'
        STATUS_COLORED="${RED}${BOLD}  NIoP${SGR0}"
    else
        if [[ ${CMD[$PID]} == *$INIFILE ]]; then
            # Wrong instance on port
            STATUS='WIoP'
            STATUS_COLORED="${RED}${BOLD}  WIoP${SGR0}"
        fi
    fi
 
    [[ $STATUS != 'OK' ]] \
        && printf '%s %12s %7s %s\n' \
                  "${STATUS_COLORED}" \
                  "${ARCHWIN_PORT}" \
                  "${WEBPORT}" \
                  "${INIFILE}"
) & done < \
         <(find "$DIR" -type f -regex '.*archint\.ini\.[^.]+')
wait


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 11:47 22-02-2016 | Исправлено: ASE_DAG, 12:17 22-02-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Да я как бы в курсе.  А надо-то что?
 

 
Да хотел скрипт в cron закинуть и чтобы он по мейлу ошибки слал.
 
Вот померил time:
Это предидущая версия скрипта:
 
/tmp/tstp2f.sh  7.28s user 64.04s system 224% cpu 31.750 total
 
А это последняя:
 
/tmp/tstp2ff.sh  7.45s user 76.08s system 224% cpu 37.275 total
 
Маленько дольше даже.
 
А вот самая первая версия скрипта:
 
/tmp/tstp2.sh  8.02s user 80.85s system 90% cpu 1:38.40 total

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 12:36 22-02-2016 | Исправлено: CrownRU, 13:52 22-02-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> Маленько дольше даже.
 
Ну фиг знает.  Так нужно еще что-то пытаться выгадать?
 
> Да хотел скрипт в cron закинуть и чтобы он по мейлу ошибки слал.  
 
Так в чем проблема?  Обработку ошибок в сам сценарий почти никогда вписывать не надо, и этот, по-моему, не исключение.  Сохраняете вывод во временный файл, анализируете, есть ли там чего посылать, посылаете.
 
Вы, конечно, можете сказать, что это неправильно, что наличие ошибки приходится определять по выводу, а по-хорошему скрипт должен давать код возврата.  Что ж, давайте сделаем так, чтоб был код возврата, хотя из-за параллельных процессов это не вполне тривиально, но вполне возможно:
 

Код:
#!/bin/bash
 
# config
DIR="/archive/obj/cssap"
ECHO_OK=
 
check-instance() {
    local pid
    read pid __ < <(fuser 2>&- "${ARCHWIN_PORT}/tcp")
    if [[ -z $pid ]]; then
        # No instance on port
        return 31
    elif [[ ${CMD[$pid]} != *$INIFILE ]]; then
        # Wrong instance on port
        return 32
    fi
}
 
echo-status() {
    printf '%s %12s %7s %s\n' \
           "${STATUS}" \
           "${ARCHWIN_PORT}" \
           "${WEBPORT}" \
           "${INIFILE}"
}
 
# coloring
if [[ -t 1 ]]; then
    RED="$(tput setaf 1)"
    GREEN="$(tput setaf 2)"
    CYAN="$(tput setaf 6)"
    BOLD="$(tput bold)"
    SGR0="$(tput sgr0)"
fi
 
printf >&2 '%s\n' \
           "NIoP --> No instance on port" \
           "WIoP --> Wrong instance on port" \
           "${BOLD}${CYAN}STATUS ARCHWIN_PORT WEBPORT INSTANCE${SGR0}"
 
while read pid cmd; do
    CMD[$pid]="$cmd"
done < \
     <(ps -e -ww -o pid= -o cmd= | grep 'archint.ini')
 
while read INIFILE; do (
    while read KEY VALUE; do
        case $KEY in
            'ARCHWIN_PORT')
                ARCHWIN_PORT="$VALUE"
                ;;
            'WEBPORT')
                WEBPORT="$VALUE"
                ;;
        esac
    done < "$INIFILE"
 
    INIFILE="${INIFILE##*/}"
    check-instance
    case $? in
        0)
            if [[ $ECHO_OK ]]; then
                STATUS="${GREEN}    OK${SGR0}"
                echo-status
            fi
            ;;
        31)
            STATUS="${RED}${BOLD}  NIoP${SGR0}"
            echo-status
            exit 31
            ;;
        32)
            STATUS="${RED}${BOLD}  WIoP${SGR0}"
            echo-status
            exit 32
            ;;
    esac
) &
SUBPROC+=( $! )
done < \
     <(find "$DIR" -type f -regex '.*archint\.ini\.[^.]+')
 
for pid in "${SUBPROC[@]}"; do
    wait "$pid"
    (( NOTOK_COUNT += $? ))
done
 
(( NOTOK_COUNT > 0 )) \
    && exit 10

 
Теперь это соответственно можно вызывать как-то так:
 
$ tstp2 &> /tmp/tstp2.out || mailme /tmp/tstp2.out
 
(где mailme — условная утилита для отправки письма вам, разумеется).
 
P. S. Да, я это само собой не проверял, так что убедитесь, что я тут ничего не поломал.


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:55 22-02-2016 | Исправлено: ASE_DAG, 16:05 22-02-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Огромное Спасибо, все работает!
 
P.S. Адресок paypal, скинте в личку пожалуйста. Хочу угостить виртуальным пивом

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 16:27 22-02-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, всегда пожалуйста, обращайтесь, если что.
 
> Адресок paypal
 
А это мы с вами уже проходили, и было это в середине сентября 14-го года.  Я вам тогда честно сообщил, что Пэй-палом как счетом я не пользуюсь, и решил по такому случаю поагитировать вас за Биткоин.  В итоге вы перевод провели через обменник напрямую, а себе даже кошелек не поставили, что меня не могло не огорчить.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:26 22-02-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
 

Цитата:
А это мы с вами уже проходили, и было это в середине сентября 14-го года.  Я вам тогда честно сообщил, что Пэй-палом как счетом я не пользуюсь, и решил по такому случаю поагитировать вас за Биткоин.  В итоге вы перевод провели через обменник напрямую, а себе даже кошелек не поставили, что меня не могло не огорчить.
 

Виноват. Просто не было нужны пользуваться биткоином. Скиньте, пожалуйста, в личку номер кошелька, еше раз.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:35 23-02-2016
iKSBi



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Есть скрипт для bash, который при получении серого IP дёргает соединение, пока не получит белый. К сожалению мой роутер (как наверное и большинство) BASH на борту не имеет. Зато в нём есть BusyBox и ASH. Я видел что довольно сложные скрипты люди переделывают под ASH, а этот совсем маленький, может кто помочь?

Код:
#!/bin/bash
STR=`ifconfig "Имя интерфейса"|grep inet`
STRARR=' ' read -a array <<< "$STR"
STRIP="${array[1]}"
I=`echo $STRIP | tr '.' ' '`
I=`echo $I | tr '/:' ' '`
STRARR=' ' read -a array <<< "$I"
STRIP1="${array[1]}"
STRIP2="${array[2]}"
STRIP3="${array[3]}"
STRIP4="${array[4]}"
 
 
 
if [[ $STRIP1 -eq "172" || $STRIP1 -eq "11" || $STRIP1 -eq "192" ]];
then
    echo $STRIP1"."$STRIP2"."$STRIP3"."$STRIP4": ""Restarting Wan Interface"
   
    (ifdown "Имя интерфейса"; sleep 5; ifup "Имя интерфейса") &
 
 
  else
 
echo $STRIP1"."$STRIP2"."$STRIP3"."$STRIP4": ""White Wan IP"
 
 
fi
 

Всего записей: 80 | Зарегистр. 30-12-2005 | Отправлено: 13:18 12-03-2016
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
iKSBi
У меня проверка на "белость" выглядит попроще
Цитата:
pub_ip=$( wget -T90 -q -O- 'http://v4.ident.me' )
wan_ip=$( nvram get wan_ipaddr )
if [ "x$pub_ip" == "x$wan_ip" ]; then
  echo 'WAN IP - White.'
else
  echo 'WAN IP - Gray.'
fi
правда неизвестно, что за прошивка в вашем раутере, но это работало на стоке от АСУС, на Мерлине, на Томате, на ОпенВРТ и на ДД-ВРТ.
Тип соединения тоже неизвестен. У меня на ПППоЕ переподключение выглядит примерно так:
Цитата:
killall -SIGHUP pppd
sleep 2
killall -SIGHUP pppd
остается только это все только засунуть в цикл с условием.
НУ или лучший вариант (зависит от проши опять же) - повесить это все на событие WAN Up.
 
Добавлено:
А еще я в начале WAN Up-скрипта жду выдачи адреса (после подключения есть небольшая задержка при выдаче):
Цитата:
until ifconfig ppp0|grep -iF "inet addr:"; do
  sleep 1
done

Всего записей: 12816 | Зарегистр. 11-03-2002 | Отправлено: 14:02 12-03-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
> проверка на "белость" выглядит попроще  
> wget -T90 -q -O- 'http://v4.ident.me'
> попроще
 
Шутить изволите?
 
 
iKSBi> скрипт для bash, который при получении серого IP дёргает соединение, пока не получит белый.
 
Да ничего подобного.  Где вы здесь видите хоть один цикл?
 
> [[ $STRIP1 -eq "172" || $STRIP1 -eq "11" || $STRIP1 -eq "192" ]]
 
Вы хотите сказать, что это проверка на «серость»?  Это абсолютно неверно, перечитайте RFC 1918.  
 
> ifconfig
 
Очень ненадежная штука.  У нее вывод не предназначен для чтения машиной.
 
Короче, держите:
 
#!/bin/busybox ash
 
iface='wlan0'
 
set $(ip -o -4 addr show "$iface")
IFS='./' read a b c d m << EOF
$4
EOF
 
if [[ $((
           ( a == 192 && b == 168 )
        || ( a == 172 && b >= 16 && b <= 31 )
        || ( a == 10 )
       )) == 1 ]]
then
    printf >&2 '%s\n' \ "${a}.${b}.${c}.${d} is a private address. Resetting WAN interface..."
    ifdown "$iface"
    sleep 5
    ifup "$iface"
else
    printf >&2 '%s\n' "${a}.${b}.${c}.${d}: We get a public WAN address"
fi

 
А вообще смените оператора связи на того, что позволяет арендовать «белый» адрес.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:44 12-03-2016 | Исправлено: ASE_DAG, 21:47 12-03-2016
iKSBi



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG
Спасибо за помощь, но к сожалению ваш скрипт не работает. Я в этом совсем плохо понимаю. Сейчас вот понял, что нужно еще || (a == 100 && b >= 64 && b <=127 ) добавить, но только на такие правки меня и хватает... Может поможет кто найти в чём дело?
 

Цитата:
/tmp # ash -vx 1.sh
#!/bin/busybox ash
 
iface='ppp0'
+ iface=ppp0
 
set $(ip -o -4 addr show "$iface")
+ ip -o -4 addr show ppp0
+ set 34: ppp0 inet 10.6.222.4 peer 83.221.214.196/32 brd 10.6.222.4 scope global ppp0
IFS='./' read a b c d m << EOF
$4
EOF
 
while [[ $((
                 ( a == 192 && b == 168 )
              || ( a == 172 && b >= 16 && b <= 31 )
              || ( a == 10 )
          )) == 1 ]]
do
    printf >&2 '%s\n' "${a}.${b}.${c}.${d}: Resetting WAN interface..."
    ifdown "$iface"
    sleep 5
    ifup "$iface"
done
 
printf >&2 '%s\n' "${a}.${b}.${c}.${d}: We got a public WAN address"
+ IFS=./ read a b c d m
/tmp #
 
 

Всего записей: 80 | Зарегистр. 30-12-2005 | Отправлено: 17:29 12-03-2016 | Исправлено: iKSBi, 18:27 12-03-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iKSBi> но к сожалению ваш скрипт не работает
 
Если не указано обратное, то я проверяю программы прежде, чем публиковать.
 
> Сейчас вот понял, что нужно еще || (a == 100 && b >= 64 && b <=127 )
 
С чего бы?
 
> Может поможет кто найти[,] в чем дело?
 
Ну, во-первых, версию оболочки покажите.  Я проверял на BusyBox v1.22.1 (Debian 1:1.22.0-9+deb8u1).
 
Во-вторых, в порядке тыка, давайте попробуем представить шестую строчку в виде:
 
IFS='./' read a b c d m <<EOF
 
Если это не поможет, то выложите-ка куда-нибудь файл сценария, что вы запускаете (1.sh то есть), в двоичном виде.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:42 12-03-2016
iKSBi



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG
Да я догадался, что это с моей стороны что-то не так, спасибо еще раз, что помогаете!
BusyBox v1.24.1 (2016-03-12 00:57:28 MSK) multi-call binary.
строку поменял, не помогло
Адреса 100.64.0.0/10    нужны потому, что когда мой провайдер выдаёт мне его - гугл по два раза спрашивает капчу. И https://2ip.ru/ определяет совсем другой IP.
https://www.dropbox.com/s/5cev79eqhggnn6g/1.sh?dl=1

Всего записей: 80 | Зарегистр. 30-12-2005 | Отправлено: 18:53 12-03-2016 | Исправлено: iKSBi, 19:03 12-03-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iKSBi> строку поменял, не помогло  
 
Можете вернуть взад.
 
> https://db.tt/slNVum2b
 
В конце каждой строки посторонний пробел.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:05 12-03-2016
iKSBi



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG
Спасибо Вам огромное! Всё работает! Оказалось, что у меня еще и ifdown ifup нету (т.к. они вроде только с BASH идут), но нашёл в sbin restart_wan, и с exec /sbin/restart_wan всё заработало.

Всего записей: 80 | Зарегистр. 30-12-2005 | Отправлено: 20:14 12-03-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iKSBi> Спасибо Вам огромное! Всё работает!
 
Всегда пожалуйста.  На будущее советую настроить ваш текстовый редактор на безусловное удаление концевых пробелов.
 
> т. к. они вроде только с BASH идут
 
Да нет, ни малейшего отношения к ГНУ Башу они не имеют.
 
> exec /sbin/restart_wan
 
Стоп.  Зачем здесь exec?

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:12 12-03-2016
iKSBi



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
> Стоп.  Зачем здесь exec?
без него почему-то этот restart_wan выполнялся многократно и бесконечно. При этом соединение оставалось активным.
Я где-то нагуглил, что бинарники иногда запускают через exec, попробовал так - и стало работать, как надо. Плюс, вроде было написано что это хорошо, т.к. бинарник запускается отдельным процессом. Вот так это выглядело.

Цитата:
 || ( a == 10 )
              || ( a == 100 && b >= 64 && b <=127 )
          )) == 1 ]]
do
    printf >&2 '%s\n' "${a}.${b}.${c}.${d}: Resetting WAN interface..."
    /sbin/restart_wan
    sleep 5
done
+ [[ 1 == 1 ]]
+ printf %s\n 100.68.105.170: Resetting WAN interface...
100.68.105.170: Resetting WAN interface...
+ /sbin/restart_wan
+ sleep 5
+ [[ 1 == 1 ]]
+ printf %s\n 100.68.105.170: Resetting WAN interface...
100.68.105.170: Resetting WAN interface...
+ /sbin/restart_wan
+ sleep 5
^C
 

Всего записей: 80 | Зарегистр. 30-12-2005 | Отправлено: 21:38 12-03-2016 | Исправлено: iKSBi, 21:45 12-03-2016
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
( a == 192 && b == 168 )
              || ( a == 172 && b >= 16 && b <= 31 )
              || ( a == 10  
Ну я все понимаю, вы крутой и проверяете диапазоны приватных подсетей, только у нас провайдер, на личном опыте знаю, выдают серые ИП из других диапазонов, например та же упомянутая 100.х.
И на ней ваша "нешуточная" проверка пролетит, а моя "шуточная" - очень даже сработает

Всего записей: 12816 | Зарегистр. 11-03-2002 | Отправлено: 21:52 12-03-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iKSBi, а, пардон, это я его загнал в бесконечный цикл — сперва написал вариант «перезапускать пока не получим», а затем недоисправил на «перезапускать один раз».  Судя по тому, что у вас «все работает» нужен был именно второй вариант:
 
#!/bin/busybox ash
 
iface='ppp0'
 
set $(ip -o -4 addr show "$iface")
IFS='./' read a b c d m << EOF
$4
EOF
 
if [[ $((
           ( a == 192 && b == 168 )
        || ( a == 172 && b >= 16 && b <= 31 )
        || ( a == 10 )
       )) == 1 ]]
then
    printf >&2 '%s\n' "${a}.${b}.${c}.${d} is a private address. Resetting WAN interface..."
    restart_wan
else
    printf >&2 '%s\n' "${a}.${b}.${c}.${d}: We get a public WAN address"
fi

 
> т. к. бинарник запускается отдельным процессом.
 
Наоборот — замещает процесс оболочки.  И неважно — бинарник или нет.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:55 12-03-2016 | Исправлено: ASE_DAG, 21:57 12-03-2016
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru