首页 > 解决方案 > 在 Bash 脚本中尝试将局部变量传递给 SSH,然后执行其他命令

问题描述

#!/bin/bash

count2=1
declare -a input
input=( "$@" )

echo " "
echo " Hostname passed by user is " ${input[0]}
HOST="${input[0]}"

sshpass -p '<pass>' ssh -o StrictHostKeyChecking=no user@$HOST /bin/bash  << ENDSSH

echo " Connected "
echo $count2
echo $input
pwd
echo $count2: ${input[$count2]}
nic=${input[$count2]}
echo $nic
echo $(ethtool "${nic}" |& grep 'Link' | awk '{print $3}')

ENDSSH

所以实际上想要传递变量'count2''input'远程SSH并执行。但不幸的是,它没有通过。它在 SSH 之后没有回显任何内容。在这方面需要帮助。!!我在服务器中安装了 sshpass。

代码输出:

[user@l07 ~]$ ./check.sh <hostname> eno6

 Hostname passed by user is  <hostname>
 Connected


在 SSH 之后,它只会回显“已连接”。我不知道为什么$count2$input也没有回应。我厌倦了强烈反对,\$count2'但这也行不通。所有可能的组合都尝试过,甚至使用ENDSSH. 请帮忙

任何帮助将不胜感激!

标签: arraysbashshellssh

解决方案


您基本上想向远程 bash 提供要执行的 HERE 文档。这很棘手,因为您需要先“撰写”该文档的全文,然后才能将其提供给 ssh。因此,我会将任务分为两部分:

  1. 创建 HERE 文档
  2. 在 ssh 上运行

这使得调试在步骤 1 和 2 之间输出文档并直观地检查其内容的正确性变得容易。不要忘记,一旦这段代码在远程主机上运行,​​它就不能再访问您的任何变量,除非您使用 ssh 提供的方法将它们“提升”到远程端。

因此你可以这样开始:

# Create the parameters you want to use
nic=${input[$count2]}

# Create a variable holding the content of the remote script,
# which interpolates your parameters
read -r -d '' remote_script << ENDSSH
echo "Connected to host \$(hostname)"
echo "Running bash version: \$BASH_VERSION"
....
ethtool "$nic" |& grep Link | awk '{ print $3 }'
ENDSSH

# Print your script for verification
echo "$remote_script"

# Submit it to the host
sshpass -p '<pass>' ssh -o StrictHostKeyChecking=no "user@$HOST" /bin/bash <<<"$remote_script"

推荐阅读