Bash - S SH на удаленный сервер и получение данных - PullRequest
1 голос
/ 17 июня 2020

У меня есть сценарий bash, которому необходимо подключиться к другому серверу для части его выполнения. Я пробовал многие стандартные инструкции и синтаксисы для выполнения команд s sh, но с небольшим прогрессом.

На удаленном сервере мне нужно получить сценарий оболочки, содержащий несколько параметров env для некоторого программного обеспечения. Затем один из этих параметров используется в пути к файлу, чтобы указать на исполняемый файл, который содержит функцию '-lprojects', которая может перечислить проекты для программного обеспечения на этом сервере.

Я проверил, что выполнение команд на сам сервер работает несколько раз. Моя проблема заключается в том, что я пытаюсь запустить те же команды через S SH. Если я использую подход, при котором я использую переменную env для пути к файлу, он показывает, что переменная имеет значение null в пути к файлу, что дает ошибку файл / каталог не найден. Если я жестко запрограммирую путь к файлу так, чтобы он указывал на исполняемый файл, я получаю сообщение об ошибке, в котором говорится, что сценарий оболочки не получен (который, как я предполагаю, нужен для других функций и API для исполняемого файла, чтобы показать его функцию -lprojects)

Вот как выглядит код:

ssh remote.server 'source /filepath/remotescript.sh'
filelist=$(ssh remote.server $REMOTEVARIABLE'/bin/executable -lprojects')

echo ${filelist[@]}

for file in $filelist
do
    echo $file
    ssh SERVER2 awk 'something' /filepath/"$file"/somefile.txt | sed 'something' >> filepath/values.csv;

done

Как видите, мне также нужно l oop через содержимое вывода -lprojects на удаленном сервере, выполните некоторые awk и sed в файлах для извлечения желаемого текста (это работает), но затем мне нужно записать это обратно в файл values.csv клиента (локального сервера). Это более общий c, так как мне придется сделать это для нескольких серверов, но все они должны записывать в один и тот же файл .csv. Для простоты вы можете рассматривать это как случай с одним удаленным сервером, так как жизненно важно, чтобы он работал по крайней мере для одного сейчас в начале.

Обратите внимание, что я также пробовал что-то вроде:

ssh remote.server << EOF
    'source /filepath/remotescript.sh'
    filelist=$(ssh remote.server $REMOTEVARIABLE'/bin/executable -lprojects')
EOF

Но с аналогичными результатами. Также поместите одинарные кавычки в список файлов как до, так и после удаленной переменной, et c.

Как мне go правильно это сделать?

Ответы [ 2 ]

4 голосов
/ 17 июня 2020

Чтобы получить доступ к переменной среды, вы должны создать сценарий, который определяет среду в том же вызове S SH, что и тот, в котором вы его используете, в противном случае вы выполняете свои команды в двух разных оболочках, которые не связаны между собой :

filelist=$(ssh remote.server 'source /filepath/remotescript.sh; $REMOTEVARIABLE/bin/executable -lprojects')
1 голос
/ 18 июня 2020

Предполагая, что executable выводит одно имя файла в строке, вы можете использовать readarray для достижения эффекта:

readarray -t filelist < <(ssh remote.server '
source /filepath/remotescript.sh
$REMOTEVARIABLE/bin/executable -lprojects
'
)

echo ${filelist[@]}

for file in $filelist
do
    echo $file
    ssh SERVER2 awk 'something' /filepath/"$file"/somefile.txt | sed 'something' >> filepath/values.csv;

done
...