繁体   English   中英

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

[英]Error when stacking SSH command arguments within a bash script using other scripts as variables

我有一个名为addresses.csv的csv文件,看起来像这样,

node-1,xx.xxx.xx.xx,us-central-a
....
node-9,xxx.xx.xxx.xx,us-east1-a

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

#!/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之前给我以下错误。

bash: /home/user/Documents/scripts/disk/firstAttach.sh: No such file or directory

脚本的 rest 运行完全正常。 唯一的错误发生在这一部分,它错过了第二个脚本。

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

ssh -i ~/.ssh/key -o StrictHostKeyChecking=no -l ${username} ${ext} "${first}"

当我这样运行它时,它也运行良好。

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"

当我像在;之前使用\一样运行命令时像这样逃避它,

ssh -i ~/.ssh/key -o StrictHostKeyChecking=no -l ${username} ${ext} "${persist}\; ${first}"

我收到以下错误,并且两个脚本都没有在代码的node-1部分中运行,但是代码的 else 循环的 rest 运行良好。

bash: /home/user/Documents/scripts/disk/persistentDisk.sh;: No such file or directory

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

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

关于read和重定向

尝试使用:

#!/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:

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读取标志,告诉使用文件描述符${list}而不是STDIN
  • foo是一些无用的变量,用于防止将行的 rest 存储在$ipxx.xxx.xx.xx,us-central-a在这种情况下)
  • {list}</path/to/filename通过查找任何空闲文件描述符来创建一个新变量。

关于ssh (和重定向)

你可以使用:

#!/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自由,以便在目标主机上运行脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM