arrays - 在 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
. 请帮忙
任何帮助将不胜感激!
解决方案
您基本上想向远程 bash 提供要执行的 HERE 文档。这很棘手,因为您需要先“撰写”该文档的全文,然后才能将其提供给 ssh。因此,我会将任务分为两部分:
- 创建 HERE 文档
- 在 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"
推荐阅读
- c# - SQL 如何替换一个值
- python - 使用 python 和请求,如何进行正确的 POST 调用以及在哪里找到标头?
- android - FirebaseAppDistribution:appDistributionUpload gradle 命令中缺少应用程序 ID
- mysql - 跨列和行计算值的实例
- javascript - 使用 redux 钩子时使用 redux 操作的最佳选择是什么?
- sql - Impala 2.11:AnalysisException:选择列表中不支持子查询
- swift - 在 SwiftUI 中获取当前的经纬度
- c++ - 是否可以禁止一个类被动态转换为?
- git - Git - 将发布分支合并到主分支
- tensorflow - 任何想法如何解决激活函数的问题?