Ad Widget

Collapse

заббикс sender и кириллица

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • zabbix777
    Member
    • Nov 2023
    • 70

    #1

    заббикс sender и кириллица

    Добрый день.
    Небольшой вопрос, думаю много кто с этим сталкивался.
    Отправляю сообщение команду заббикс sender через powershell на траппер
    Code:
    zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent\zabbix_agentd.conf" -k trap.error -o "фывфы"
    Получаю на элементе данных ?????
    отправляю латиницу
    Code:
    zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent\zabbix_agentd.conf" -k trap.error -o "asdasd"
    получаю данные в норм кодировке см. вложение
    Как можно кириллицу нормально отправить через заббикс sender?
    Attached Files
  • Alex_UUU
    Senior Member
    • Dec 2018
    • 541

    #2
    Уверен, что в повершеле есть конвертилка в utf8
    Поиграл бы с ней.
    А так да, даже в своих скриптах постоянно конвертишь все.

    Comment

    • zabbix777
      Member
      • Nov 2023
      • 70

      #3
      Originally posted by Alex_UUU
      Уверен, что в повершеле есть конвертилка в utf8
      Поиграл бы с ней.
      А так да, даже в своих скриптах постоянно конвертишь все.
      Пробую так:
      Code:
      text = "Привет, мир!"
      $utf8String = [System.Text.Encoding]::UTF8.GetString([System.Text.Encoding]::GetEncoding("WINDOWS-1251").GetBytes($text))
      zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent\zabbix_agentd.conf" -k trap.error -o "$utf8String"
      Все равно вопросы

      Comment


      • zabbix777
        zabbix777 commented
        Editing a comment
        Есть у кого-нибудь опыт отправки кирилицы из powershell в заббикс?
        Идея в том, что у меня есть скрипт, что запускает определенную программу, которая в момент выполнения выводит статусы о ее выполнении, я могу отловить ошибки в этих статусах и хотел бы их перенаправить в заббикс, чтобы он мне оповещение выслал.
    • zabbix777
      Member
      • Nov 2023
      • 70

      #4
      Originally posted by zabbix777

      Пробую так:
      Code:
      text = "Привет, мир!"
      $utf8String = [System.Text.Encoding]::UTF8.GetString([System.Text.Encoding]::GetEncoding("WINDOWS-1251").GetBytes($text))
      zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent\zabbix_agentd.conf" -k trap.error -o "$utf8String"
      Все равно вопросы
      Короче не понимаю я, что в какой кодировке надо заббиксу подсунуть кирилицу и как это правильно сделать. Вот простой скрипт, где я просто текст сохранаю в фаил, где везде указываю кодировку utf-8. Фаил действительно создаеться с кодировкуо utf-8 и потом скармливаю его заббикс сендеру:
      Code:
      # Создаем временный файл с текстом
      $text = "Ваш текст здесь"
      $tempFile = [System.IO.Path]::GetTempFileName()
      Set-Content -Path $tempFile -Value $text -Encoding UTF8
      
      # Заменяем содержимое исходного файла
      $originalFile = "C:\2\1.txt"
      Remove-Item -Path $originalFile -Force
      Copy-Item -Path $tempFile -Destination $originalFile
      $text = Get-Content -Path $tempFile -Encoding UTF8
      zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent 2\zabbix_agent2.conf" -k test.trap.error -o "$text"
      И все равно на выходе ??? ????? ?????

      Зато если я делаю вот так:
      Code:
      $text = "Ваш текст здесь"
      echo "- test.trap.error $text" | zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent 2\zabbix_agent2.conf" -i -
      то все ок и на выходе "Ваш текст здесь". Хотя здесь я нигде не указывал кодировку и тупо из powershell значение переменной отослал.

      При этом если это делать более прямым и логичным способом
      Code:
      $text = "Ваш текст здесь"
      zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent 2\zabbix_agent2.conf" -k test.trap.error -o "$text"
      Опять на выходе ??? ????? ?????​. Короче какая-то шляпа. Принцип я так и не понял. Если кто может объяснить, подскажите.

      Comment

      • zabbix777
        Member
        • Nov 2023
        • 70

        #5
        Originally posted by zabbix777

        Пробую так:
        Code:
        text = "Привет, мир!"
        $utf8String = [System.Text.Encoding]::UTF8.GetString([System.Text.Encoding]::GetEncoding("WINDOWS-1251").GetBytes($text))
        zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent\zabbix_agentd.conf" -k trap.error -o "$utf8String"
        Все равно вопросы
        Пробую так:
        Code:
        text = "Привет, мир!"
        $utf8String = [System.Text.Encoding]::UTF8.GetString([System.Text.Encoding]::GetEncoding("WINDOWS-1251").GetBytes($text))
        zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent\zabbix_agentd.conf" -k trap.error -o "$utf8String"
        Все равно вопросы[/QUOTE]

        Короче не понимаю я, что в какой кодировке надо заббиксу подсунуть кирилицу и как это правильно сделать. Вот простой скрипт, где я просто текст сохранаю в фаил, где везде указываю кодировку utf-8. Фаил действительно создаеться с кодировкуо utf-8 и потом скармливаю его заббикс сендеру:
        Code:
        # Создаем временный файл с текстом
        $text = "Ваш текст здесь"
        $tempFile = [System.IO.Path]::GetTempFileName()
        Set-Content -Path $tempFile -Value $text -Encoding UTF8
        
        # Заменяем содержимое исходного файла
        $originalFile = "C:\2\1.txt"
        Remove-Item -Path $originalFile -Force
        Copy-Item -Path $tempFile -Destination $originalFile
        $text = Get-Content -Path $tempFile -Encoding UTF8
        zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent 2\zabbix_agent2.conf" -k test.trap.error -o "$text"
        И все равно на выходе ??? ????? ?????

        Зато если я делаю вот так:
        Code:
        $text = "Ваш текст здесь"
        echo "- test.trap.error $text" | zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent 2\zabbix_agent2.conf" -i -
        то все ок и на выходе "Ваш текст здесь". Хотя здесь я нигде не указывал кодировку и тупо из powershell значение переменной отослал.

        При этом если это делать более прямым и логичным способом
        Code:
        $text = "Ваш текст здесь"
        zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent 2\zabbix_agent2.conf" -k test.trap.error -o "$text"
        Опять на выходе ??? ????? ?????. Короче какая-то шляпа. Принцип я так и не понял. Если кто может объяснить, подскажите.​

        Comment


        • zabbix777
          zabbix777 commented
          Editing a comment
          Последние два теста делал из VS Code, когда те же два теста сделал из командной строки PS в обоих случаях на заббикс приходили вопросы.
      • zabbix777
        Member
        • Nov 2023
        • 70

        #6
        Жаль, что ответа не дождался. Вообщем выход я нашел, вдруг кому пригодиться. Вообщем-то он такой, как я в прошлом посте описал
        Code:
        $text = "Ваш текст здесь"
        echo "- test.trap.error $text" | zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent 2\zabbix_agent2.conf" -i -
        Важно: Чтобы powershell был 7 и выше. Я пробовал на 5.1 и на 7.4.4. 5.1 полная шляпа косяков с кодировкой там целая куча, даже если конкретно указываешь сохранить текст в файл нужной кодировки, описанный выше метод в нем не работает. Стабильного результата удалось добиться только на версии powershell 7.
        Итоговый код для поиска ошибки в получился такой
        Code:
        $command = "какая-нибудь команда"
        $arguments = @(
        "какие нибудь аргументы",
        ...    
        )
        #исполнение команды с аргументами
        $import = Invoke-Command -ScriptBlock {& $command $arguments}
        #ищем ошибкe в выводе команду
        $importError = $import -like '*ошибка*'​
        отправляем на заббикс
        Write-Output "- trap.error $importError" | zabbix_sender.exe -c "$env:ProgramFiles\Zabbix Agent 2\zabbix_agent2.conf" -i -    
        ​


        Может кто пояснит почему все-таки две последних команды из предыдущего поста различаются? Если нет, тему можно закрывать.

        Comment

        • teddy
          Senior Member
          • Dec 2017
          • 234

          #7
          Может кто пояснит почему все-таки две последних команды из предыдущего поста различаются?
          как по мне то ответ очень прост. когда вы что то передаете в командную строку - пош автоматом конвертит это в cp866, т.к МС считает что в комнадной строке cmd ничего иного быть не должно. echo работает через вызов cmd.
          когда вы делаете Write-Out с пайпом - то такой конвертации не происходит и идет текст в том виде как его обрабатывает Powershell, а у него по умоланию UTF8.
          Возможно в psh7 что то поправили, не скажу т.к стараюсь пользовать штатные средства для универсальности. psh7 пока не штатный.
          Но у меня вопрос - а зачем вам вообще sender,trapper и командная строка?
          можно ж использовать "кастомные" скрипты на агенте и там такой проблемы почти нет. просто обеспечиваешь вывод в консоль UTF8 и все работает.

          Comment


          • zabbix777
            zabbix777 commented
            Editing a comment
            про echo понял, но по факту между Write-Out и echo я разницы не увидел. они обе работают на PS7 и обе не работают на PS5 с точки зрения кодировки.
            Про кастомный скрипт не понял. У меня есть PS-скрипт для работы сторонней программы, мне показалось логичнее в него просто одну строку для отправки заббикс добавить, а что я должен в агенте добавлять, чтобы вывод работы этого скрипта парсить?
        • teddy
          Senior Member
          • Dec 2017
          • 234

          #8
          почитайте в доке про кастомные скрипты на агенте. там вносится в кофиг агента указание где брать скрипт и с какими параметрами. и забикс будет его запускать. по расписанию, по запросу, в пасивном или активном режиме, через прокси... выбор опций большой.
          И весь консольный вывод такого скрипта идет на сервер как значение item. Обычно скрипты строят json а уже на сервере его парсят в точечные айтемы.
          Last edited by teddy; 04-10-2024, 07:37.

          Comment

          Working...