6

我写了一个脚本来 ssh 到远程服务器以查找用户的磁盘使用情况。但是,此脚本只能读取第一行,它不会继续读取文件的其他行。我的脚本有什么问题吗?谢谢。

#!/bin/bash
FILE="myfile.txt"
while read line; do
server=`echo $line|awk '{print $1}'`
cpid=`echo $line|awk '{print $2}'`
echo $server "---" $cpid "---" `ssh $server grep $cpid /var/cpanel/repquota.cache|awk '{print int($3/1000) "MB"}'`
done < $FILE

myfile.txt 内容:

服务器1用户1 服务器2 用户
2 服务器3 用户
3

4

2 回答 2

8

ssh调用从 while 循环继承其标准输入,该循环从您的文件重定向。这会导致ssh命令使用文件的其余部分。您需要使用不同的文件描述符来提供read命令:

#!/bin/bash
FILE="myfile.txt"
while read -u 3 server cpid; do
  printf "$server---$cpid---"
  ssh $server "grep $cpid /var/cpanel/repquota.cache | awk '{print int($3/1000) \"MB\"}'"
done 3< $FILE

另一种方法是将输入显式重定向到sshfrom /dev/null,因为无论如何您都没有使用它。

#!/bin/bash
FILE="myfile.txt"
while read server cpid; do
  printf "$server---$cpid---"
  < /dev/null ssh $server "grep $cpid /var/cpanel/repquota.cache | awk '{print int($3/1000) \"MB\"}'"
done < $FILE
于 2013-03-01T22:38:03.177 回答
1

首先,您可以将读取循环简化为

while read server cpid; do
    echo $server "---" $cpid "---" `ssh ...`
done <$FILE

并用 awk 保存解析。另一个简化是保存对 grep 的调用并让 awk 进行搜索$cpid

ssh $server "awk '/$cpid/ {print int(\$3/1000) \"MB\"}' /var/cpanel/repquota.cache"

对于您的问题,我猜ssh调用不会返回,因为它等待密码或其他东西,因此会阻止循环继续。

于 2013-03-01T22:18:08.727 回答