首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用其他脚本作为变量在bash脚本中堆叠SSH命令参数时出错

使用其他脚本作为变量在bash脚本中堆叠SSH命令参数时出错
EN

Stack Overflow用户
提问于 2020-12-30 02:08:05
回答 1查看 39关注 0票数 0

我有一个名为addresses.csv的csv文件,如下所示:

代码语言:javascript
复制
node-1,xx.xxx.xx.xx,us-central-a
....
node-9,xxx.xx.xxx.xx,us-east1-a

下面我有一个名为0run.sh的脚本,

代码语言:javascript
复制
#!/bin/bash
username='user'
persist="bash /home/${username}/Documents/scripts/disk/persistentDisk.sh"
first="bash /home/${username}/Documents/scripts/disk/firstAttach.sh"

while IFS=, read -r int ip <&3; do
  if [ "$int" == "node-1" ]; then
--->ssh -i ~/.ssh/key -o StrictHostKeyChecking=no -l ${username} ${ip} "${persist}; ${first}"<---
  else
    ssh -i ~/.ssh/key -o StrictHostKeyChecking=no -l ${username} ${ip} "${first}"
  fi
done 3<addresses.csv

错误发生在我绘制箭头的代码部分。

当它在node-1上运行时,它不是先运行..persistentDisk.sh,然后运行..firstAttach.sh,而是只运行..persistentDisk.sh,并在运行..persistentDisk之前给我以下错误。

代码语言:javascript
复制
bash: /home/user/Documents/scripts/disk/firstAttach.sh: No such file or directory

脚本的其余部分完全可以正常运行。唯一的错误发生在这一部分,它遗漏了第二个脚本。

当我像这样运行命令时,它运行得很好。

代码语言:javascript
复制
ssh -i ~/.ssh/key -o StrictHostKeyChecking=no -l ${username} ${ext} "${first}"

当我像这样运行它时,它也运行得很好。

代码语言:javascript
复制
ssh -i ~/.ssh/key -o StrictHostKeyChecking=no -l user xxx.xx.xxx.xx "bash /home/${username}/Documents/scripts/disk/persistentDisk.sh; bash /home/${username}/Documents/scripts/disk/firstAttach.sh"

当我像这样在;之前使用\运行命令来转义它时,

代码语言:javascript
复制
ssh -i ~/.ssh/key -o StrictHostKeyChecking=no -l ${username} ${ext} "${persist}\; ${first}"

我得到了以下错误,两个脚本都没有在代码的node-1部分运行,但是代码的其余else循环运行得很好。

代码语言:javascript
复制
bash: /home/user/Documents/scripts/disk/persistentDisk.sh;: No such file or directory

为什么我不能使用变量在ssh的if语句中堆叠这两个命令?

EN

回答 1

Stack Overflow用户

发布于 2020-12-30 03:38:57

如果我清楚地理解了:您的真正的问题在于让STDIN在目标主机上自由交互!

关于read和重定向

尝试使用:

代码语言:javascript
复制
#!/bin/bash
username='user'
persist="bash /home/${username}/Documents/scripts/disk/persistentDisk.sh"
first="bash /home/${username}/Documents/scripts/disk/firstAttach.sh"

while IFS=, read -r -u $list int ip foo; do
  if [ "$int" == "node-1" ]; then
       echo CMD... $ip, $persist
  else
       [ "$ip" ] && echo CMD... $ip, $first
  fi
done {list}<addresses.csv

经过测试,这个èroduce:

代码语言:javascript
复制
CMD... xx.xxx.xx.xx, bash /home/user/Documents/scripts/disk/persistentDisk.sh
CMD... xxx.xx.xxx.xx, bash /home/user/Documents/scripts/disk/firstAttach.sh

要读取的

  • -u标志,告知使用文件描述符而不是STDIN
  • foo是一些无用的变量,用于防止行的其余部分存储在$ip中(此case)
  • {list}</path/to/filename中的xx.xxx.xx.xx,us-central-a通过查找任何空闲的文件描述符创建一个新变量。

关于ssh (和重定向)

您可以使用:

代码语言:javascript
复制
#!/bin/bash
username='user'
persist="/home/${username}/Documents/scripts/disk/persistentDisk.sh"
first="/home/${username}/Documents/scripts/disk/firstAttach.sh"

while IFS=, read -r -u $list int ip foo; do
  [ "$int" = "node-1" ] && cmd=persist || cmd=first
  [ "$ip" ] && ssh -i ~/.ssh/key -t -o StrictHostKeyChecking=no \
                   -l ${username} ${ext} /bin/bash "${!cmd}"
  done {list}<addresses.csv

通过使用此语法,可以使STDIN空闲以供目标主机上运行的脚本使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65496715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档