Исключите вывод из ssh и записывайте только ошибку, если она найдена.

Вопрос или проблема

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "
  $(cat);
  IFERROR=$(checkscript);
  echo "$IFERROR"" > ${SSHTEMPFILE} 2>&1    

Эта строка… Я не могу исключить сообщение “пользователь авторизован” из ssh… IFERROR возвращает значения, которые мне нужно отслеживать, но также и ужасное сообщение “!!! ТОЛЬКО ДЛЯ АВТОРИЗОВАННОГО ИСПОЛЬЗОВАНИЯ !!!” из ssh…
Я уже пробовал что-то подобное, но это не работает:

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "
  $(cat);
  IFERROR=$(checkscript);
  echo "$IFERROR"" | grep -v "AUTHORIZED"  > ${SSHTEMPFILE} 2>&1    

Сообщение, которое вы пытаетесь исключить, вероятно, является баннером ssh. Оно отображается в stderr, и поэтому grep -v не работает в вашем скрипте.

Просто попробуйте перенаправить stderr в stdin перед grep. Это должно сработать.
Я не совсем понимаю вашу команду, но это будет выглядеть так:

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "$(cat); IFERROR=$(checkscript); echo "$IFERROR"" 2>&1 | grep -v "AUTHORIZED" > ${SSHTEMPFILE}

PS: Какова цель $(cat)?

Я не уверен, что вы пытаетесь сделать, но в вашем скрипте есть как минимум одна очевидная ошибка. У вас есть

ssh "$(cat); …"$IFERROR"" | …

Фрагмент $IFERROR не находится в кавычках, он расширяется локальным шеллом для построения SSH-команды, которая выполняется. Вы хотите выполнить echo "$IFERROR" на удаленной стороне, поэтому вам нужно заключить $ в кавычки, чтобы предотвратить его локальное расширение:

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "
  $(cat);
  IFERROR=$(checkscript);
  echo \"\$IFERROR\"" > ${SSHTEMPFILE} 2>&1

Команда checkscript также выполняется локально. Если вы хотели, чтобы она выполнялась удаленно, измените IFERROR=$(checkscript) на IFERROR=\$(checkscript).

Вам не нужно сохранять вывод checkscript в переменной. Вы можете это сделать, но это усложняет вашу жизнь без пользы. Просто получите его вывод напрямую.

typeset -f |
sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "$(cat); checkscript" > ${SSHTEMPFILE} 2>&1

Ответ или решение

Исключение вывода SSH и логирование только ошибок: детальное руководство

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

Проблема

В вашем исходном скрипте выполняется команда на удалённом сервере с помощью SSH. При этом вы сталкиваетесь с проблемой: сообщение "!!! AUTHORIZED USE ONLY !!!" выводится в стандартный поток ошибок (stderr) и мешает вам получить только необходимую информацию об ошибках.

Подход к решению

  1. Понимание вывода: Сообщение о разрешённом использовании передаётся через stderr. Чтобы его исключить из вывода, нужно перенаправить stderr в stdout, а затем применить фильтрацию.

  2. Корректное выполнение команд: Следует убедиться, что команды выполняются на удаленном сервере, а не локально. Это можно сделать с помощью правильного экранирования.

  3. Оптимизация кода: Вместо переменной для хранения вывода команды checkscript лучше сразу выводить результат. Это упростит ваш код и избавит от лишних шагов.

Пример исправленного кода

Вот пример кода, который соответствует описанным выше рекомендациям:

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "($(cat); checkscript) 2>&1" | grep -v "AUTHORIZED" > ${SSHTEMPFILE}

Разбор кода

  • typeset -f: эта команда выводит текущие функции, что может быть полезно для удалённого сеанса.
  • sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS}: команда SSH с использованием sshpass для автоматической передачи пароля.
  • "$(cat); checkscript": выполняются команды на удалённой машине. Здесь $() используется для выполнения локальной команды, поэтому следует использовать (...), чтобы командная оболочка интерпретировала их как команду на удаленном сервере.
  • 2>&1: это перенаправление stderr в stdout, что позволяет обрабатывать все сообщения в одном потоке.
  • grep -v "AUTHORIZED": фильтрация вывода, исключающая строки с указанным сообщением.
  • > ${SSHTEMPFILE}: перенаправление итогового вывода в файл для дальнейшего анализа.

Заключение

С помощью описанных шагов вы сможете исключить ненужный вывод SSH и логировать только важные ошибки. Настройте команды так, чтобы все операции выполнялись на удалённом сервере, и оптимизируйте скрипт для лучшей читаемости и удобства. Эти улучшения сделают вашу работу с удалёнными серверами более эффективной и организованной.

Если у вас возникли дополнительные вопросы или сложности с реализацией предложенных решений, не стесняйтесь задавать их. è

Оцените материал
Добавить комментарий

Капча загружается...