我有一个名为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"
当我在;
之前用运行命令来像这样转义时,
ssh -i ~/.ssh/key -o StrictHostKeyChecking=no -l ${username} ${ext} "${persist}; ${first}"
我得到了以下错误,两个脚本都没有在代码的node-1
部分中运行,但代码的其他循环运行良好。
bash: /home/user/Documents/scripts/disk/persistentDisk.sh;: No such file or directory
为什么我不能使用变量在ssh的if语句中堆叠这两个命令?
如果我清楚地理解:您的真正的问题在于让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
经过测试,该产品:
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
对于在目标主机上运行的脚本是免费的。