Удаление символов возврата на одну строку из строк вывода журнала sshseclib в PHP - PullRequest
0 голосов
/ 31 января 2019

У меня есть функция, которая подключается к сетевому устройству через ssh и выполняет некоторые функции, проблема в том, что когда строка слишком длинная, она заполнена символом возврата и повторяющимися частями, я пытаюсь отформатировать, чтобы она была удобочитаемой для человека,Я храню эти строки в массиве, и они доставляются через JSON.Ниже приведен пример:

$log .= $configure->exec("security-mng 1 state enable mode permit ingress-type iphost 1 protocol web telnet");

и вывод из него:

OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iph\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$g 1 state enable mode permit ingress-type iph           \b\b\b\b\b\b\b\b\b\b\bo          \b\b\b\b\b\b\b\b\b\bs         \b\b\b\b\b\b\b\b\bt        \b\b\b\b\b\b\b\b        \b\b\b\b\b\b\b1      \b\b\b\b\b\b      \b\b\b\b\bp    \b\b\b\br   \b\b\bo  \b\bt\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$enable mode permit ingress-type iphost 1 prot           \b\b\b\b\b\b\b\b\b\b\bo          \b\b\b\b\b\b\b\b\b\bc         \b\b\b\b\b\b\b\b\bo        \b\b\b\b\b\b\b\bl       \b\b\b\b\b\b\b       \b\b\b\b\b\bw     \b\b\b\b\be    \b\b\b\bb   \b\b\b   \b\bt\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$e permit ingress-type iphost 1 protocol web t           \b\b\b\b\b\b\b\b\b\b\be          \b\b\b\b\b\b\b\b\b\bl         \b\b\b\b\b\b\b\b\bn        \b\b\b\b\b\b\b\be       \b\b\b\b\b\b\bt      \b\b\b\b\b\b\r\n

Мне удалось избавиться от \ b и двойных пробелов через preg_replace ("/ \ s \ s| [[: ^ print:]] / "," ",), но это не решает проблему, потому что есть повторяющиеся части.Ниже приведен вывод без символа возврата и двойного пробела, но, как я уже сказал, это не решает реальную проблему повторяющихся частей:

OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iph$g 1 state enable mode permit ingress-type iph os t1pr ot$enable mode permit ingress-type iphost 1 prot oc ol  w eb  t$e permit ingress-type iphost 1 protocol web t el ne t

1 Ответ

0 голосов
/ 31 января 2019
  1. Последовательности \ b на самом деле не говорят, сколько символов нам нужно удалить.
  2. Кроме того, удаление всех из них оставит вас с оставшимися пробелами, которые вы не сможете определить, еслиони должны быть удалены или нет.

Этот фрагмент кода показывает, что происходит, когда мы пробуем эти два подхода:

<code><?php
$log_line = <<<'EOF'
OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iph\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$g 1 state enable mode permit ingress-type iph           \b\b\b\b\b\b\b\b\b\b\bo          \b\b\b\b\b\b\b\b\b\bs         \b\b\b\b\b\b\b\b\bt        \b\b\b\b\b\b\b\b        \b\b\b\b\b\b\b1      \b\b\b\b\b\b      \b\b\b\b\bp    \b\b\b\br   \b\b\bo  \b\bt\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$enable mode permit ingress-type iphost 1 prot           \b\b\b\b\b\b\b\b\b\b\bo          \b\b\b\b\b\b\b\b\b\bc         \b\b\b\b\b\b\b\b\bo        \b\b\b\b\b\b\b\bl       \b\b\b\b\b\b\b       \b\b\b\b\b\bw     \b\b\b\b\be    \b\b\b\bb   \b\b\b   \b\bt\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b$e permit ingress-type iphost 1 protocol web t           \b\b\b\b\b\b\b\b\b\b\be          \b\b\b\b\b\b\b\b\b\bl         \b\b\b\b\b\b\b\b\bn        \b\b\b\b\b\b\b\be       \b\b\b\b\b\b\bt      \b\b\b\b\b\b
EOF;

// converting the line into an array of char
// str_replace here is useful to turn \b into one character,
// it will be easier to parse the string as an array below
$log_array = str_split(str_replace("\b", chr(8), $log_line));
$final_log_array = [];

// Now, we parse the log line char by char
foreach ($log_array as $char) {
    // if we encountered a '\b' character, we "pop"
    // the last character from the array
    // otherwise, we "push" the character to the array
    if ($char == chr(8))
        array_pop($final_log_array);
    else
        array_push($final_log_array,$char);
}

// Time to see the result
$final_log_line=implode($final_log_array);
echo "<pre>";
echo "Expected line:\n";
echo "OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iphost 1 protocol web telnet\n";
echo "Result line:\n";
echo $final_log_line . "\n";
echo "Line with all \b and double spaces removed:\n";
echo preg_replace("/(?:\\\b|\s\s)+/", "", $log_line);
echo "
";?>

(Вы можете попробовать этот код с помощью PhpFiddle .)

Выходные данные показывают:

Expected line:
OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iphost 1 protocol web telnet
Result line:
OLT-235(gpon-onu-mng)#$e permit ingress-type iphost 1 protocol web telnet
Line with all \b and double spaces removed:
OLT-235(gpon-onu-mng)#security-mng 1 state enable mode permit ingress-type iph$g 1 state enable mode permit ingress-type iph os t1pr ot$enable mode permit ingress-type iphost 1 prot oc ol  w eb  t$e permit ingress-type iphost 1 protocol web t el ne t

Вы видите, что первая попытка обрезает начало строки, авторая оставляет вам такие последовательности, как protocol web t el ne t, которые вы не сможете очистить программно.

ИМХО, если я не ошибся здесь, вы должны искать корень этого поведения.отчет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...