SSH через несколько серверов и сохранение вывода нескольких команд в файле на локальном сервере

SSH через несколько серверов и сохранение вывода нескольких команд в файле на локальном сервере

Я хочу использовать SSH на нескольких серверах (хост 1, хост 2 и хост 3) и сохранять вывод нескольких команд (cmd1, cmd2 и т. д.) в файле (output.properties) на локальном сервере. Я знаю, что есть несколько постов, похожих на этот, но я не уверен, где я ошибаюсь. Ниже приведен фрагмент кода.

folderPath="cd /usr/local/apps/tempdir";
echo $folderPath;
eval $folderPath;

# host 1
echo RepCard1=$(expr $(grep -r "sample text" * | wc -l) / 2) >> /usr/local/host1/tempdir/output.properties;

# Server 2

ssh -T user@host2 <<EOF >>/usr/local/host1/tempdir/output.properties;
#alias GetDuplicateCardStats="cd /usr/local/apps/tempdir"
folderPath="cd /usr/local/apps/tempdir";
echo $folderPath;
eval $folderPath;

echo RepCard2=$(expr $(grep -r "sample text" * | wc -l) / 2);
exit
EOF

. /usr/local/host1/tempdir/output.properties;

echo "host 1"
echo $RepCard1

echo "host 2"
echo $RepCard2
# RepCard2 is always executed on Host 1 and print value from host 1

В чем ошибка в приведенном выше сценарии?

решение1

В этой строке:

echo RepCard2=$(expr $(grep -r "sample text" * | wc -l) / 2);

exprи grepбудет запущен на локальной системе, а не на сервере SSH. Вам нужно экранировать символы $, чтобы они сохранились в here-doc и были отправлены на сервер.

echo RepCard2=\$(expr \$(grep -r "sample text" * | wc -l) / 2);

Связанный контент