Вернуть многострочный выход ssh в отдельные переменные?

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

RHEL 8.10

OpenSSH_8.0p1, OpenSSL 1.1.1k FIPS 25 Мар 2021

Как и ожидалось, эта строка (с двумя встроенными командами) возвращает две строки:

$ ssh -q remoteserver "ls -1 /proc/${p}/fd | wc -l ; ps -Ostate  -p${p} | tail -n1"
969
1353432 S S ?        00:00:12 pgpool: wait for accept lock

Как мне сохранить каждую строку в отдельную переменную на локальном сервере? (Поскольку я должен запускать ssh сотни раз, и каждый из них занимает более 0.25 секунд, я пытаюсь минимизировать количество вызовов ssh.)

Цель состоит в том, чтобы, например, переменная FDcnt имела значение 969, а PidState была 1353432 S S ? 00:00:12 pgpool: wait for accept lock.

Это работает, но кажется немного хаковским:

blarge=()
while read -r
do 
    blarge+=("$REPLY")
done <<<$(ssh -q FISPCDSPGS202c "ls -1 /proc/${p}/fd | wc -l ; ps -Ostate  -p${p} | tail -n1")
echo ${blarge[0]}
970
$ echo ${blarge[1]}
1353432 S S ? 00:00:12 pgpool: fis_cds cdsbmop 10.55.96.151(33710) idle

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

Чтобы эффективно обрабатывать многострочный вывод команды SSH и хранить результаты в отдельных переменных на локальном сервере, можно использовать более элегантный и читабельный подход, нежели предоставленный выше. Данный метод не требует массивов и делает код более интуитивно понятным.

Решение

Вы можете использовать команду ssh в сочетании с командой read для разделения многократного вывода на разные переменные. Это можно сделать следующим образом:

output=$(ssh -q remoteserver "ls -1 /proc/${p}/fd | wc -l; ps -Ostate -p${p} | tail -n1")

{
    read FDcnt
    read PidState
} <<< "$output"

echo "Количество файловых дескрипторов: $FDcnt"
echo "Состояние процесса: $PidState"

Пояснение кода

  1. Получение вывода: Используем команду ssh, чтобы выполнить команды на удалённом сервере и сохраняем весь вывод в переменной output.

  2. Чтение из переменной: С помощью блока кода { ... } и команды read мы читаем строки из переменной output. Первая строка будет присвоена переменной FDcnt, а вторая — переменной PidState.

  3. Вывод результатов: В конце мы выводим значения переменных. Это даёт чёткое представление о том, что делает скрипт, а также каковы результаты.

Преимущества данного подхода

  • Читаемость: Код становится более понятным и легче поддерживаемым.
  • Эффективность: Метод избегает лишних вычислений, выполняя ssh только один раз, что критично при многократных вызовах.
  • Простота: Не требуется создание массивов, что упрощает структуру кода и снижает вероятность ошибок.

Важные замечания

  1. Убедитесь, что переменная ${p} определена и содержит корректное значение перед выполнением команды.
  2. Так как вы работаете с удалённым сервером, возможно, потребуется учитывать сетевые задержки, что может повлиять на время выполнения.

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

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

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