2013-03-01 15 views
6

Bir kullanıcının disk kullanımını bulmak için uzak sunucuya ssh komut dosyası yazdım. Ancak, bu betik sadece ilk satırı okuyabilir, dosyanın diğer satırlarında devam etmez. Senaryoda yanlış olan bir şey var mı? Teşekkürler.Bash komut dosyası yalnızca dosyanın ilk satırını okuyor

#!/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 içeriği:

sunucu1 kullanici1
server2 kullanici2
server3 kullanıcı3 Eğer

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

için okuma döngü basitleştirmek ve kaydedebilir tüm

+1

Ssh komutu komut satırından mı çalışıyor? ssh -o CommandTimeout = 20 ... 'yi kullanarak başarısız bir bağlantıyı zaman aşımına uğratın – suspectus

+0

Evet, ssh komut kısmı çalışır. İlk satırın sonucunu alabilirim. – garconcn

+0

İkinci sütun bir kullanıcı adı gibi görünüyor. Bu gerçekten $ cpid ile aynı mı yoksa üçüncü bir sütun var mı? –

cevap

8

ssh numaralı çağrı, standart girişini dosyanızdan yönlendiren while döngüsünden devralıyor. Bu, dosyanın geri kalanını tüketmek için ssh komutuna neden olur. Sen read komutunu tedarik etmek farklı bir dosya tanımlayıcı kullanmak gerekir:

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

alternatif açıkça /dev/null den ssh girdi yöneltmek olan, yine kullanmadığınız beri.

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

"-u 3" parçasını orijinal betiğime ekledim, şimdi çalışıyor.Teşekkür ederim – garconcn

+0

Aynı problemi çözmüştüm! Teşekkür ederim. –

1

İlk awk ile ayrıştırma. Başka sadeleştirme bir şifre falan ve böylece önler bekler çünkü ben, ssh çağrı dönmez tahmin awk grep ve izin çağrıyı kaydetmek sorununuza için $cpid

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

için arama yapmaktır devam etmek için döngü.

+0

Komut dosyasını basitleştirmek için öneriniz için teşekkürler, ancak sözdizimi hatası aldım. – garconcn

+0

@garconcn Hangi sözdizimi hatası alıyorsunuz? –

+0

bash: -c: line 0: beklenmedik belirtecin yanında sözdizimi hatası '(' bash: -c: satır 0:' awk/user1/{print int ($ 3/1000) "MB"}/var/cpanel/repquota. önbellek ' – garconcn

İlgili konular