如果我的文件包含以下内容:
127.0.0.1
127.0.0.2
127.0.0.3
8.8.8.8
127.0.0.4
并运行此命令以快速测试SSH连接成功或失败:
while read host
do
ssh -n -q -o BatchMode=yes -o ConnectTimeout=5 $host "echo 2>&1" && \
printf "%-15s%-45s%s" `id -un` $host "SSH_OK" || \
printf "%-15s%-45s%s" `id -un` $host "SSH_BAD"
done <host_list
我明白了:
myname 127.0.0.1 SSH_OK
myname 127.0.0.2 SSH_OK
myname 127.0.0.3 SSH_OKmyname 8.8.8.8 SSH_BAD
myname 127.0.0.4 SSH_OK[myname@server ~]$
正如您所看到的,它看起来很讨厌,因为它不会为SSH_BAD输出或最后一行打印新内容,因此bash提示被标记为上次检查结束。
我可以通过向prinf添加\n
来解决这个问题,但是除了BAD行之外,我在所有内容上都有双倍空格。
有人可以告诉我,当我没有指定换行时,printf从哪里获取换行符,以及为什么它为SSH_OK行而不是SSH_BAD行打印一行。
有没有好的/简单的方法来解决这个问题?
谢谢你 FLO答案 0 :(得分:1)
新行来自您在远程系统上运行的echo 2>&1
。当ssh
成功时,执行此命令,并在printf
之前打印换行符。当ssh
失败时,命令不会运行,因此在printf
之前没有换行符。
我建议你使用一个不显示任何内容的命令,然后将\n
放在printf
行中:
while read host
do
ssh -n -q -o BatchMode=yes -o ConnectTimeout=5 $host "true" && \
printf "%-15s%-45s%s\n" `id -un` $host "SSH_OK" || \
printf "%-15s%-45s%s\n" `id -un` $host "SSH_BAD"
done <host_list