2017-09-09 97 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