Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Возможно ли, чтобы в переменной из текстового файла было 8 МБ?

    Возможно ли, чтобы в переменной из текстового файла было 8 МБ?

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Возможно ли, чтобы в переменной из текстового файла было 8 МБ?, RouterOS
     
    Kataius
    Guest
    #1
    0
    29.02.2024 18:34:00
    Всем привет! Хочу сделать скрипт, который будет запускаться раз в неделю и обновлять список адресов на Mikrotik. Исходя из этой темы: http://forum.mikrotik.com/t/max-size-of-variables-still-at-4096-anwser-is-no/168007/6 я нашёл очень полезный скрипт для создания переменных. Пытаюсь импортировать файл file.txt размером 8 МБ, но он обрезается примерно до 3 МБ. Я что-то делаю не так или так не получится? Спасибо! Мой скрипт такой:

    :global thefile ""
    {
       :local url        http://public-dns.info/nameservers-all.txt ;
       :local filesize   ([/tool fetch url=$url as-value output=none]->"downloaded")
       :local maxsize    64512 ; # максимальный поддерживаемый размер читаемого блока из файла
       :local start      0
       :local end        ($maxsize - 1)
       :local partnumber ($filesize / ($maxsize / 1024))
       :local reminder   ($filesize % ($maxsize / 1024))
       :if ($reminder > 0) do={ :set partnumber ($partnumber + 1) }
       :for x from=1 to=$partnumber step=1 do={
            :set thefile ($thefile . ([/tool fetch url=$url http-header-field="Range: bytes=$start-$end" as-value output=user]->"data"))
            :set start   ($start + $maxsize)
            :set end     ($end   + $maxsize)
       }
    }

    #:log info "debug_thefile=$thefile"
    #/file remove [find where name="check.txt"];
    #:execute ":put \$thefile" file=check.txt;

    :global content value=$thefile;
    :local contentLen value=[:len $content];
    :local lineEnd value=0;
    :local line value="";
    :local lastEnd value=0;
    :local addressListName;
    :set addressListName "DNS-DOH";

    :if ($thefile != null) do={
     :log info "Появились новые DNS"
     /ip firewall address-list remove [/ip firewall address-list find list=$addressListName]
     :do {
         :set lineEnd [:find $content "\n" $lastEnd ] ;
         :set line [:pick $content $lastEnd $lineEnd] ;
         :set lastEnd ( $lineEnd + 1 ) ;
         :local entry [:pick $line 0 $lineEnd ]
         :if ($entry~"^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}") do={
               :if ( [:len $entry ] > 0 ) do={
    #:log info "debug_entry=$entry"
                   /ip firewall address-list add list=$addressListName address=$entry;
               }
         }
       } while=($lineEnd < $contentLen);
     } else={
     :log info "В списке нет DNS"
    }
     
     
     
    Kataius
    Guest
    #2
    0
    29.03.2024 23:28:00
    Ещё один вверху?
     
     
     
    optio
    Guest
    #3
    0
    30.03.2024 16:53:00
    Подозреваю, что в аргументе http-header-field для команды fetch есть баг, возможно, он неправильно отправляется (я не проверял это на локальном веб-сервере для анализа). При загрузке данных всегда получается 64512 байт, независимо от того, какой диапазон указан в заголовке, когда output=user as-value:  
    :put [:len ([/tool fetch url="https://public-dns.info/nameservers-all.txt" http-header-field="Range: bytes=0-1" output=user as-value]->"data")]
    64512  

    Когда output=file, скачивается весь файл:  
    /tool fetch url="https://public-dns.info/nameservers-all.txt" http-header-field="Range: bytes=0-1" output=file  
    :delay 3  
    :put [get "nameservers-all.txt" size]
    1396869  

    Это говорит о том, что заголовок Range отправляется некорректно. При использовании curl всё нормально:  
    curl -s -H 'Range: bytes=0-1' https://public-dns.info/nameservers-all.txt | wc -c  
    2
     
     
     
    msatter
    Guest
    #4
    0
    30.03.2024 20:57:00
    @optio В этом нет ничего странного, Data — это переменная, и максимум — 64512 байт. У меня не получилось читать части из файлов, поэтому пока занимаюсь другими делами, пока это не исправят… когда-нибудь.
     
     
     
    optio
    Guest
    #5
    0
    30.03.2024 21:49:00
    Этого не должно было происходить, поскольку заголовок Range установлен. 64512 — это потому, что загружаются все данные и ограничиваются этим значением, что неправильно (должно быть 2, как в curl).
     
     
     
    msatter
    Guest
    #6
    0
    31.03.2024 01:03:00
    Читайте это так: ставите [:len ...... ->"data")]. Команда Curl wc — это количество слов, а не байт. Обновление: запустил строку в Терминале, и RouterOS всегда читает 64512 байт, при этом используется только первая цифра из 0-1. “downloaded=63;duration=00:00:01;status=finished”, а 63 * 1024 = 64512 байт. RouterOS здесь немного сокращает, думая, что данные будут помещены в переменную, и максимальный размер — 64512 байт, так что почему бы не впихнуть всё туда целиком, а пользователь уже сам может взять всё или часть.
     
     
     
    optio
    Guest
    #7
    0
    31.03.2024 09:08:00
    Возможно, вы забыли аргумент -c… $ wc --help  
    Использование: wc [OPTION]... [FILE]...
    или: wc [OPTION]... --files0-from=F
    Выводит количество строк, слов и байт для каждого файла, а также итоговую строку, если указано более одного файла. Слово — это последовательность печатных символов ненулевой длины, разделённая пробелами.  
    ...  
     -c, --bytes            выводить количество байт  
    ... Всё просто, скачивайте через fetch и curl с тем же заголовком Range:  
    :put ([/tool fetch url="https://public-dns.info/nameservers-all.txt" http-header-field="Range: bytes=0-1" output=user as-value]->"data")
    2607:5300:203:1797::53  
    ... 64512 — это просто неверное количество данных, данные должны содержать только первые 2 байта (в данном случае символы 2 и 6), потому что задан заголовок Range, и если он правильно отправлен, сервер отдаст только их, как при использовании curl:  
    curl -s -H 'Range: bytes=0-1' https://public-dns.info/nameservers-all.txt  
    26
     
     
     
    jaclaz
    Guest
    #8
    0
    31.03.2024 09:32:00
    @optio Извините, но исходя из результатов экспериментов, которые вы опубликовали, может быть так, что «Range: bytes=0-1» читается или интерпретируется как (в псевдокоде): «Range: from_offset=0 length=64512» (потому что любая длина меньше 64512 округляется до 64512) или просто игнорируется (по каким-то причинам) и всегда возвращает первые 64512 байт, независимо от указанных вами значений диапазона. Нельзя ли во второй операции извлечь первые 2 байта из полученных 64512? Мне кажется, что нужно проверить, действительно ли учитывается часть «from_offset=0». То есть возвращает ли (в вашей команде/настройке) «Range: bytes=1-1» 64512 байт, причем первый из них будет 07?
     
     
     
    optio
    Guest
    #9
    0
    31.03.2024 10:10:00
    Это операция на стороне сервера для заголовка Range (сервер возвращает байты в зависимости от значения заголовка Range), подробнее см. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range. Вот в чём мой главный аргумент: да, вы можете извлечь из возвращённых байтов некоторые байты, но получить скачивание всего файла частями таким способом не получится. Если вы скачиваете весь файл с помощью fetch, то столкнётесь с проблемой, о которой тут упоминается — вы не сможете использовать /file/read, чтобы читать все байты по частям в переменную. Если же заголовок Range для fetch будет работать, тогда это станет возможным.
     
     
     
    msatter
    Guest
    #10
    0
    31.03.2024 10:17:00
    @optio Я действительно пропустил -c в конце. Теперь я думаю, что веб-сервер не отправляет количество запрошенных байт, потому что может не поддерживать передачу по частям (chunking) и посылает все данные одним куском. Переменная data может вместить только 64512 байт — это то, что возвращает RouterOS. Остальная часть файла игнорируется, и моё прежнее предположение, что это был своего рода скользящий окно, оказалось неверным. Если поддержка chunking есть на другой стороне, то RouterOS должен работать правильно. Кстати, это способ проверить, поддерживает ли веб-сервер chunking в скриптах RouterOS. Если вы получаете длину (len) 64512 или больше, чем запрошенное количество байт +1, значит chunking не поддерживается. ПРОВЕРКА: :put ([/tool fetch url="https://view.sentinel.turris.cz/greylist-data/greylist-latest.csv" http-header-field="Range: bytes=0-80" output=user as-value]->"data")
    # Условия использования смотрите на https://view.sentinel.turris.cz/greylist-data/LICENSE. :put [:len ([/tool fetch url="https://view.sentinel.turris.cz/greylist-data/greylist-latest.csv" http-header-field="Range: bytes=0-80" output=user as-value]->"data")]
    81
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры