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の内容:

server1 user1
server2 user2
server3 user3

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

ssh別の方法は、入力をからに明示的にリダイレクトする/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で保存します。もう1つの単純化は、grepの呼び出しを保存し、awkに検索を実行させることです。$cpid

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

あなたの問題として、私はssh、パスワードか何かを待っているので、呼び出しが戻らないと思います。そのため、ループが続行できなくなります。

于 2013-03-01T22:18:08.727 に答える