Skip to the content.

Bash

31 May 2023 - joy717

bash读取文件中的hosts,再用ssh登录到远程机器,命令未能正常执行。

现象为:只有第一个节点的部分命令得到执行 原因是:while read从文件中读取的时候,需要指定< abc.txt来读取数据流,但这个会被ssh命令给拦截。

错误示范

#!/bin/bash
kubectl get nodes --no-headers -o wide | grep -v master | awk '{print $6}' > hosts.txt

input="hosts.txt"

while IFS= read -r line
do      
  echo $line
  ssh $line mkdir -p "/etc/docker/certs.d/1.2.3.4:10043"
  scp /etc/docker/certs.d/1.2.3.4:10043/ca.crt root@$line:/etc/docker/certs.d/1.2.3.4:10043/ca.crt
done < "$input"

应该修改为

#!/bin/bash
kubectl get nodes --no-headers -o wide | grep -v master | awk '{print $6}' > hosts.txt

input="hosts.txt"

while IFS= read -r line
do      
  echo $line
  ssh $line mkdir -p "/etc/docker/certs.d/1.2.3.4:10043" < /dev/null
  scp /etc/docker/certs.d/1.2.3.4:10043/ca.crt root@$line:/etc/docker/certs.d/1.2.3.4:10043/ca.crt < /dev/null
done < "$input"

注意: 实际上,就是在ssh这些命令之后,加上一个 < /dev/null 来结束ssh相关的命令

bash执行脚本,期望将结果重定向到文件内,但有时候最终文件内没有内容

# a.log内没有内容
./aaa.sh > a.log

# 正确方式1,  &> 代表stdout, stderr的合集
./aaa.sh &> a.log
# 正确方式2
./aaa.sh > a.log 2>&1