将文本回显到 bash 脚本中的多个文件
echo text to multiple files in bash script
我正在编写一个 bash 脚本,该脚本使用 pssh 到 运行 外部命令,然后将命令的输出与每个服务器的 IP 连接起来。 pssh 有一个选项 -o 可以将每个服务器的文件写入指定的目录,但如果命令没有 运行,则只有一个空文件。我遇到的问题是用 "Server Unreachable" 之类的东西更新这些空文件,这样我就知道到达服务器时存在连接问题,并且不会导致脚本的其余部分出现问题。
这是我目前的情况:
#!/bin/bash
file="/home/user/tools/test-host"
now=$(date +"%F")
folder="./cnxhwinfo-$now/"
empty="$(find ./cnxhwinfo-$now/ -maxdepth 1 -type f -name '*' -size 0 -printf '%f%2d')"
command="echo $(uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7==\"min\") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,\"days\",h+0,\"hours\",m+0,\"minutes\"}'), $(hostname | awk '{print $1}'), $(sudo awk -F '=' 'FNR == 2 {print $2}' /etc/connex-release/version.txt), $(lscpu | awk -F: 'BEGIN{ORS=\", \";} NR==4 || NR==6 || NR==15 {print $2}' | sed 's/ *//g') $(free -k | awk '/Mem:/{print $2}'), $(df -Ph | awk '/var_lib/||/root/ {print $2,\",\"$5,\",\"}')"
pssh -h $file -l user -t 10 -i -o /home/user/tools/cnxhwinfo-$now -x -tt $command
echo "Server Unreachable" | tee "./cnxhwinfo-$now/$empty"
ls ./cnxhwinfo-$now >> ./cnx-data-$now
cat ./cnxhwinfo-$now/* >> ./cnx-list-$now
paste -d, ./cnx-data-$now ./cnx-list-$now >>./cnx-data-"$(date +"%F").csv"
我试图使用 find 来定位空文件并写入 "Server" unavailable using tee with this:
echo "Server Unreachable" | tee "./cnxhwinfo-$now/$empty"
如果指定的文件夹不存在,我会收到此错误:
tee: ./cnxhwinfo-2019-09-03/: 是一个目录
如果它确实存在(即,我再次 运行 脚本),它会创建一个以 find 命令返回的 IP 地址命名的文件,如下所示:
192.168.1.2 192.168.1.3 192.168.1.4 1
我也试过:
echo "Server Unreachable" | tee <(./cnxhwinfo-$now/$empty)
find 命令在一行中输出 IP 地址,每行之间有一个 space,所以我认为 tee 可以使用,但我觉得我要么 [=36] =]宁陷入语法问题,或者我正在以错误的方式解决这个问题。我有同一个脚本的另一个版本,它使用常规 ssh 并且运行良好,只是比使用 pssh 慢得多。
empty
应该是一个数组,假设 none 的文件名将在其名称中包含任何空格。
readarray -t empty < <(find ...)
echo "Server unreachable" | (cd ./cnxhwinfo-$now/; tee "${empty[@]}" > /dev/null)
否则,您将通过连接空文件名来构建单个文件名。
我正在编写一个 bash 脚本,该脚本使用 pssh 到 运行 外部命令,然后将命令的输出与每个服务器的 IP 连接起来。 pssh 有一个选项 -o 可以将每个服务器的文件写入指定的目录,但如果命令没有 运行,则只有一个空文件。我遇到的问题是用 "Server Unreachable" 之类的东西更新这些空文件,这样我就知道到达服务器时存在连接问题,并且不会导致脚本的其余部分出现问题。
这是我目前的情况:
#!/bin/bash
file="/home/user/tools/test-host"
now=$(date +"%F")
folder="./cnxhwinfo-$now/"
empty="$(find ./cnxhwinfo-$now/ -maxdepth 1 -type f -name '*' -size 0 -printf '%f%2d')"
command="echo $(uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7==\"min\") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,\"days\",h+0,\"hours\",m+0,\"minutes\"}'), $(hostname | awk '{print $1}'), $(sudo awk -F '=' 'FNR == 2 {print $2}' /etc/connex-release/version.txt), $(lscpu | awk -F: 'BEGIN{ORS=\", \";} NR==4 || NR==6 || NR==15 {print $2}' | sed 's/ *//g') $(free -k | awk '/Mem:/{print $2}'), $(df -Ph | awk '/var_lib/||/root/ {print $2,\",\"$5,\",\"}')"
pssh -h $file -l user -t 10 -i -o /home/user/tools/cnxhwinfo-$now -x -tt $command
echo "Server Unreachable" | tee "./cnxhwinfo-$now/$empty"
ls ./cnxhwinfo-$now >> ./cnx-data-$now
cat ./cnxhwinfo-$now/* >> ./cnx-list-$now
paste -d, ./cnx-data-$now ./cnx-list-$now >>./cnx-data-"$(date +"%F").csv"
我试图使用 find 来定位空文件并写入 "Server" unavailable using tee with this:
echo "Server Unreachable" | tee "./cnxhwinfo-$now/$empty"
如果指定的文件夹不存在,我会收到此错误:
tee: ./cnxhwinfo-2019-09-03/: 是一个目录
如果它确实存在(即,我再次 运行 脚本),它会创建一个以 find 命令返回的 IP 地址命名的文件,如下所示:
192.168.1.2 192.168.1.3 192.168.1.4 1
我也试过:
echo "Server Unreachable" | tee <(./cnxhwinfo-$now/$empty)
find 命令在一行中输出 IP 地址,每行之间有一个 space,所以我认为 tee 可以使用,但我觉得我要么 [=36] =]宁陷入语法问题,或者我正在以错误的方式解决这个问题。我有同一个脚本的另一个版本,它使用常规 ssh 并且运行良好,只是比使用 pssh 慢得多。
empty
应该是一个数组,假设 none 的文件名将在其名称中包含任何空格。
readarray -t empty < <(find ...)
echo "Server unreachable" | (cd ./cnxhwinfo-$now/; tee "${empty[@]}" > /dev/null)
否则,您将通过连接空文件名来构建单个文件名。