2017-09-09 98 views
0

我做劇本:希望將數據附加到文件

for server in ${servTab[*]}; do 
echo $server >> /var/www/html/df.txt 
/usr/bin/expect <<EOF 
spawn ssh $server df | grep /appl/ | awk '{print \\\$4}' | sed s/%// >> /var/www/html/df.txt 
expect "password" 
send "$pass\r" 
expect "$ " 
EOF 

,但運行後我有錯誤:

spawn ssh server-1-lin df | grep /appl/ | awk '{print $4}' | sed s/%// >> /var/www/html/df.txt 
ksh: /var/www/html/df.txt: cannot create [No such file or directory] 

它的工作原理,只有當它看起來象下面這樣:

for server in ${servTab[*]}; do 
echo $server >> df.txt 
/usr/bin/expect <<EOF 
spawn ssh $server df | grep /appl/ | awk '{print \\\$4}' | sed s/%// >> df.txt 
expect "password" 
send "$pass\r" 
expect "$ " 
EOF 

但總是在用戶的主目錄中創建文件「df.txt」,而不管目錄腳本是哪個目錄。感謝幫助。

+0

順便說一句:添加shebang和'done'。 – Cyrus

+0

請勿使用期望值。如果您使用它的唯一原因是自動爲ssh傳遞密碼,則可以使用'sshpass'。 –

+0

...和,當然,當創建它的重定向是>> >> df.txt時,當前工作目錄中會創建*'df.txt'。你爲什麼期望有什麼不同? –

回答

0

這裏的簡單答案是停止使用expect;它會讓你的生活變得更加複雜,在目前的情況下,沒有令人信服的優勢。

#!/usr/bin/env bash 

# make sure this is an array 
servTab=(serverOne serverTwo serverThree) 

# Advice: Stop passing passwords around and use SSH agent authentication. 
[[ $pass ]] || read -s -r -p "Password: " pass 

# open your output file *once*; truncate it when that happens. 
exec 3>/var/www/html/df.txt 

for server in "${servTab[@]}"; do 
    echo "$server" >&3 
    SSHPASS="$pass" sshpass -e "$server" df  \ 
    | awk '/appl/ { gsub(/%/, ""); print $4 }' \ 
    >&3 
done