【问题标题】:Run a command on remote machine and store its output in variable on remote machine在远程机器上运行命令并将其输出存储在远程机器上的变量中
【发布时间】:2019-11-07 08:25:39
【问题描述】:

我想在评论中捕获以特定模式开头的 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&gt;&amp;1 也不起作用:

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

【问题讨论】:

  • 你真的允许root登录吗?

标签: linux bash shell ssh


【解决方案1】:

TL;DR:使用&lt;&lt;"EOF" 而不是&lt;&lt;EOF

您的 Here-Document 将在脚本发送到您的 ssh 服务器之前展开所有变量并评估所有子 shell。

考虑以下脚本:

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

这将打印servername(您要连接的计算机的名称),而是您的本地主机的名称(您正在使用的计算机的名称)。

ssh被执行之前,子shell$(hostname)被执行。然后将生成的字符串“echo localhostname”传递给ssh 并在远程服务器上执行。

要解决此问题,您必须在 Here-Document 中转义 $ 或使用文字 Here-Document:

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

【讨论】:

  • 使用文字 Here-Document 未显示错误,但未将输出存储在输入变量中...但是如果我在远程终端中手动执行命令,则会显示输出。有什么问题?
  • 我需要更多关于到底发生了什么的信息。在第一个 echo 之后添加行 set -x 并向我们展示完整的输出(直接将其添加到问题中或留下指向 pastebin.com 的链接)
  • 现在也回显 "$(hostname)" 显示我的远程机器的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
相关资源
最近更新 更多