Вопрос или проблема
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) и мешает вам получить только необходимую информацию об ошибках.
Подход к решению
-
Понимание вывода: Сообщение о разрешённом использовании передаётся через stderr. Чтобы его исключить из вывода, нужно перенаправить stderr в stdout, а затем применить фильтрацию.
-
Корректное выполнение команд: Следует убедиться, что команды выполняются на удаленном сервере, а не локально. Это можно сделать с помощью правильного экранирования.
-
Оптимизация кода: Вместо переменной для хранения вывода команды
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 и логировать только важные ошибки. Настройте команды так, чтобы все операции выполнялись на удалённом сервере, и оптимизируйте скрипт для лучшей читаемости и удобства. Эти улучшения сделают вашу работу с удалёнными серверами более эффективной и организованной.
Если у вас возникли дополнительные вопросы или сложности с реализацией предложенных решений, не стесняйтесь задавать их. è