2016-01-02 40 views
-1

所以即时尝试写一个脚本,通过SSH自动连接过于复杂的代码问题

我有三个文件。 首先是文本文件(file.txt的)我的登录凭据(现在它只有一个,但后来会有几个):

user1 abcd 

第二个文件(connect.sh)是bash的文件读取凭据并将他们希望文件是这样的:

#!/bin/bash 

while IFS='' read -r line || [[ -n "$line" ]]; do 
    count=0; 
    words[0]=""; 
    for word in $line; do 
     words[$count]="$word" 
     count=$(($count + 1)) 
    done 
    myDir="$(dirname "$0")" 
    "$myDir/find.sh" "${words[1]}" 
done < "$1" 

第三个文件(find.sh)是/预期文件,该文件是这样的:

#!/usr/bin/expect 

set password [lindex $argv 0] 
spawn ssh "[email protected]" 
expect "Password:" 
send "$password\r" 
interact 

然而,当我尝试登录它未能提供 密码。据我检查密码是正确发送到期望的脚本。此外,我尝试设置超时功能,但它也不起作用。

+2

您应该使用SSH密钥。 –

+2

你让自己变得更难。期望的是Tcl,一个完整的脚本系统,可以读取文件,无需调用另一个进程寻求帮助。既然你的bash脚本几乎什么都不做(什么是数字?你不使用它)放弃额外的噪音。在expect脚本中调试'puts'也会有所帮助。 – msw

+2

我不确定发布时是否发布了错字。无论如何,要模拟'enter'键,你必须使用'\ r',而不是'/ r'。 – Dinesh

回答

1

由于垃圾指出的那样,你可以做

#!/usr/bin/expect 

proc main {passfile} { 
    set fh [open $passfile r] 
    while {[gets $fh line] != -1} { 
     lassign [split $line] user pass 
     connect $user $pass 
    } 
    close $fh 
} 

proc connect {user password} { 
    spawn ssh [email protected] 
    expect "Password:" 
    send "$password\r" 
    interact 
} 

main [lindex $argv 0] 

然后用密码文件

./test.exp file.txt 

顺便说一句,“.SH”是不是一个伟大的扩展使用的调用你的期望脚本预计计划。