Rsyslog, omprog и python - PullRequest
       76

Rsyslog, omprog и python

0 голосов
/ 29 апреля 2020

У меня проблема с модулем omprog в Rsyslog при попытке заставить его взаимодействовать с моим кодом python (2.7). Предполагается, что Rsyslog отправляет нужные сообщения на стандартный ввод python, но ничего не получает. Интересно, был ли кто-то еще более успешным с этим модулем вывода?

Rsyslog.conf

module(load="omprog")
template(name="sshmsg" type="string" string="%msg%")
if ($programname == "myprogram") then {
    action(type="omprog"
           binary="/usr/sshtrack.py"
           template="sshmsg")
}

Если я заменю двоичный файл тестовым сценарием оболочки, содержащим строка ниже, это работает

test. sh

!#/bin/sh

cat /dev/stdin >> /var/log/ssh2.log

Я также попытался прочитать stdin из сценария оболочки в переменную, используя

var="$(</dev/stdin)"

и

var="$(cat /dev/stdin)"

Ни один из вышеперечисленных результатов var не содержит ничего

Наконец, при попытке чтения стандартного ввода из python сценарий, я ничего не получаю. Иногда появляется сообщение об ошибке ресурса недоступно (errno 11).

sshtrack.py

#!/usr/bin/python
import sys

f = open("/var/log/ssh2.log", "a", 0)

while True:
    f.write("Starting\n")
    for line in sys.stdin:
        f.flush()
        msg = line.strip()
        if not msg:
            break
        f.write(msg)
        f.write("\n")
    f.close()

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

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

В случае вашего сценария оболочки вы можете использовать read для чтения в переменную.

#!/bin/bash

# This will read until \n
read log

echo $log

Исходный код python (протестирован с python 3.8.2) можно настроить на :

#!/usr/bin/env python3

import sys

# Changed from unbuffered to buffered as unbuffered is only possible in binary mode Ref (1):
f = open("/var/log/ssh2.log", "a", 1)

while True:
    f.write("Starting\n")
    for line in sys.stdin:
        f.flush()
        msg = line.strip()
        if not msg:
            break
        f.write(msg)
        f.write("\n")
    f.close()

Если вы хотите получить вывод выполненного вами сценария (отладка), вы можете настроить параметры в Rsyslog.conf с параметром output

module(load="omprog")
template(name="sshmsg" type="string" string="%msg%")
if ($programname == "myprogram") then {
    action(type="omprog"
           binary="/usr/sshtrack.py"
           output="/var/log/sshtrack.log"
           template="sshmsg")
}

Ссылка (1): { ссылка }

0 голосов
/ 29 апреля 2020

Я заметил, что ваш шаблон sshmsg не заканчивается новой строкой. Попробуйте изменить его на string = "% msg% \ n". Хотя для rsyslog это не имеет значения, Python не сможет предоставить вам данные, пока не увидит новую строку.

Тогда это должно сработать, но вы, вероятно, не увидите никакого вывода из вашего python, поскольку он буферизован. Попробуйте добавить f.flush() после последней записи в l oop или открыть файл без буферизации.

omprog будет держать канал открытым, посылая несколько строк, пока ваша программа не выйдет.

Обратите внимание, что не все оболочки могут понимать синтаксис $().

...