2013-03-01 15 views
6

Napisałem skrypt do ssh do zdalnego serwera, aby znaleźć wykorzystanie dysku przez użytkownika. Jednak ten skrypt może tylko odczytać pierwszy wiersz, nie jest kontynuowany w innych wierszach pliku. Coś nie tak z moim scenariuszem? Dzięki.Skrypt Bash odczytuje tylko pierwszą linię pliku

#!/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 

zawartość myfile.txt:

serwer1 user1
server2 użytkownik2
serwer3 użytkownik3

+1

Czy polecenie ssh działa z wiersza poleceń? Możesz użyć ssh -o CommandTimeout = 20 ... do przekroczenia limitu czasu połączenia awaryjnego – suspectus

+0

Tak, działa część poleceń ssh. Mogę uzyskać wynik pierwszej linii. – garconcn

+0

Druga kolumna wygląda jak nazwa użytkownika. Czy to naprawdę jest to samo co '$ cpid', czy jest tam trzecia kolumna? –

Odpowiedz

8

Połączenie ssh dziedziczy standardowe wejście z pętli while, która przekierowuje z pliku. Powoduje to, że komenda ssh zużywa resztę pliku. Musisz użyć innego deskryptor dostarczyć komendę 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 

Alternatywą jest wyraźnie przekierować wejście do ssh z /dev/null, ponieważ nie używasz tak.

#!/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 
+0

Dodałem część "-u 3" do mojego oryginalnego skryptu, działa teraz Dziękuję – garconcn

+0

Miał ten sam problem i ten naprawił go! Dziękuję Ci. –

1

Przede wszystkim można uprościć pętlę odczytu do

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

i zapisać parsowanie z awk. Innym uproszczeniem jest uratować wywołanie grep i niech awk zrobić poszukiwania $cpid

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

do Twojego problemu, myślę, że rozmowa ssh nie wraca, bo czeka na hasło czy coś iw ten sposób zapobiega pętla, aby kontynuować.

+0

Dziękuję za sugestię, aby uprościć skrypt, ale dostałem błąd składni. – garconcn

+0

@garconcn Jakiego błędu składni dostajesz? –

+0

bash: -c: linia 0: błąd składni w pobliżu nieoczekiwanego tokenu '(' bash: -c: linia 0:' awk/user1/{print int (3 $/1000) "MB"}/var/cpanel/repquota. cache ' – garconcn

Powiązane problemy