linux - 使用其他脚本作为变量在 bash 脚本中堆叠 SSH 命令参数时出错
问题描述
我有一个名为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
脚本的其余部分运行良好。唯一的错误发生在这一部分,它错过了第二个脚本。
当我像这样运行命令时,它运行良好。
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"
当我像这样运行命令\
之前使用 a;
来逃避它时,
ssh -i ~/.ssh/key -o StrictHostKeyChecking=no -l ${username} ${ext} "${persist}\; ${first}"
我收到以下错误,并且两个脚本都没有node-1
在代码部分中运行,但其余代码的 else 循环运行良好。
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
是一些无用的变量,用于防止将其余行存储在$ip
(xx.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
在目标主机上自由运行脚本。
推荐阅读
- javascript - 如何在 JavaScript 中在浏览器中创建选择?
- angular - 嗨,我用 swiper angular 遇到了这个错误
- vb.net - 每次按下键都会在文本框 VB.NET 中自动显示小数位
- javascript - HTML - 带有 ahref 和按钮的下拉菜单
- java - 在 Spring Boot 2.4 中从配置服务器读取属性
- mysql - 如何在 MySQL 中使用复合主键在同一张表上创建 nn 关系
- python - Pyqt5 中的 matplotlib.plot
- java - 尝试通过rabbitMQ实现nexmo SDK的调用入站时发生java.lang.AbstractMethodError
- java - 我无法运行任何版本的 swagger-fox。Spring Boot 2.4.2 + JDK 8
- swift - launchd:注册 URL 方案的启动顺序