Запустите команду на удаленном компьютере и сохраните ее вывод в переменной на удаленном компьютере. - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу зафиксировать количество правил iptables, которые начинаются с определенного шаблона в комментарии, а затем удалить их. Это то, чего я хочу достичь. Вот мой bash-скрипт

ssh -o "StrictHostKeyChecking no" root@$ip_address << EOF
echo "Now Removing your IPTables";

#storing output in input variable
input=$(iptables -nL INPUT --line-number | grep ip.* | cut -d " " -f1 | xargs)

#converting variable into an array
arr1=($input);

#loop through each element of array
echo "length:${#arr1[@]}";
for (( i="${#arr1[@]}"-1;i >=0; i-- ));
do
    echo "$i:${arr1[$i]}"
    iptables -D INPUT $i;
done;
EOF

Проблема в том, что команда iptables не выполняется на удаленной машине, а в выводе показано, что длина arr1 равна 0. Но я уверен, что iptables имеет правила с моим желаемым шаблоном.

Ошибка, отображаемая на терминале:

-bash: line 9: 3: command not found

Добавление 2>&1 в конце команды также не работает:

input=$(iptables -nL INPUT --line-number | grep ip.* | cut -d " " -f1 | xargs 2>&1)

1 Ответ

2 голосов
/ 07 ноября 2019

TL; DR: используйте <<"EOF" вместо <<EOF.

Ваш Here-Document расширит все переменные и оценит все подоболочки до того, как скрипт будет даже отправлен в ваш sshserver.

Рассмотрим следующий сценарий:

ssh user@servername <<EOF
    echo "$(hostname)"
EOF

Это будет не print servername (имя компьютера, к которому вы подключаетесь), а имявместо этого ваш локальный хост (имя компьютера, на котором вы работаете).

Перед выполнением ssh выполняется подоболочка $(hostname). Результирующая строка "echo localhostname" затем передается в ssh и выполняется на удаленном сервере.

Чтобы решить эту проблему, вы должны экранировать $ внутри Here-Document или использовать литерал Here-Документ:

ssh user@servername <<"EOF"
    echo "$(hostname)"
EOF
...