diff options
Diffstat (limited to 'bin/jlogin.in')
-rw-r--r-- | bin/jlogin.in | 75 |
1 files changed, 48 insertions, 27 deletions
diff --git a/bin/jlogin.in b/bin/jlogin.in index 31be4f6..729afa7 100644 --- a/bin/jlogin.in +++ b/bin/jlogin.in @@ -1,8 +1,9 @@ #! @EXPECT_PATH@ -- ## -## $Id: jlogin.in,v 1.41 2004/01/11 05:39:15 heas Exp $ +## $Id: jlogin.in,v 1.56 2006/12/05 16:50:52 heas Exp $ ## -## Copyright (C) 1997-2004 by Terrapin Communications, Inc. +## @PACKAGE@ @VERSION@ +## Copyright (C) 1997-2006 by Terrapin Communications, Inc. ## All rights reserved. ## ## This software may be freely copied, modified and redistributed @@ -42,15 +43,13 @@ set password_file $env(HOME)/.cloginrc set do_command 0 set do_script 0 # The default is to automatically enable -set enable 1 +set avenable 1 # The default is to look in the password file to find the passwords. This # tracks if we receive them on the command line. set do_passwd 1 -# No passphrase by default -set passphrase "" # Find the user in the ENV, or use the unix userid. -if {[ info exists env(CISCO_USER) ] } { +if {[ info exists env(CISCO_USER) ]} { set default_user $env(CISCO_USER) } elseif {[ info exists env(USER) ]} { set default_user $env(USER) @@ -66,6 +65,9 @@ if {[ info exists env(CISCO_USER) ] } { } regexp {\(([^)]*)} "$reason" junk default_user } +if {[ info exists env(CLOGINRC) ]} { + set password_file $env(CLOGINRC) +} # Sometimes routers take awhile to answer (the default is 10 sec) set timeout 120 @@ -107,12 +109,16 @@ for {set i 0} {$i < $argc} {incr i} { set userpasswd [ lindex $argv $i ] } set do_passwd 0 + # Version string + } -V* { + send_user "@PACKAGE@ @VERSION@\n" + exit 0 # passphrase } -r* - -R* { if {! [ regexp .\[rR\](.+) $arg ignore passphrase]} { incr i - set passphrase [ lindex $argv $i ] + set avpassphrase [ lindex $argv $i ] } # Expect script to run. } -s* - @@ -254,6 +260,7 @@ proc source_password_file { password_file } { } # Log into the router. +# returns: 0 on success, 1 on failure proc login { router user passwd cmethod cyphertype identfile} { global spawn_id in_proc do_command do_script passphrase prompt global sshcmd @@ -262,6 +269,7 @@ proc login { router user passwd cmethod cyphertype identfile} { # try each of the connection methods in $cmethod until one is successful set progs [llength $cmethod] foreach prog [lrange $cmethod 0 end] { + incr progs -1 if [string match "telnet*" $prog] { regexp {telnet(:([^[:space:]]+))*} $prog command suffix port if {"$port" == ""} { @@ -271,7 +279,7 @@ proc login { router user passwd cmethod cyphertype identfile} { } if { $retval } { send_user "\nError: telnet failed: $reason\n" - exit 1 + return 1 } } elseif ![string compare $prog "ssh"] { # ssh to the router & try to login with or without an identfile. @@ -280,24 +288,24 @@ proc login { router user passwd cmethod cyphertype identfile} { if {$identfile != ""} { if [ catch {spawn $sshcmd -c $cyphertype -x -l $user -i $identfile $router} reason ] { send_user "\nError: failed to $sshcmd: $reason\n" - exit 1 + return 1 } } else { if [ catch {spawn $sshcmd -c $cyphertype -x -l $user $router} reason ] { send_user "\nError: failed to $sshcmd: $reason\n" - exit 1 + return 1 } } } elseif ![string compare $prog "rsh"] { - if [ catch {spawn rsh -l $user $router} reason ] { - send_user "\nError: rsh failed: $reason\n" - exit 1 + send_error "\nError: unsupported method: rsh\n" + if { $progs == 0 } { + return 1 } + continue } else { - puts "\nError: unknown connection method: $prog" + send_user "\nError: unknown connection method: $prog\n" return 1 } - incr progs -1 sleep 0.3 # This helps cleanup each expect clause. @@ -345,8 +353,12 @@ proc login { router user passwd cmethod cyphertype identfile} { catch {close}; send_user "\nError: Unknown host\n"; wait; return 1 } - -re "Enter passphrase for RSA key '\[^'\]*': " { - send_user "\nKey has passphrase!\n" + "Login incorrect" { + send_user "\nError: Check your password for $router\n" + catch {close}; wait; return 1 + } + -re "Enter passphrase.*: " { + # sleep briefly to allow time for stty -echo sleep 1 send "$passphrase\r" exp_continue } @@ -423,9 +435,11 @@ proc run_commands { prompt command } { } send "quit\r" expect { - "\n" { exp_continue } - timeout { return 0 } - eof { return 0 } + "\n" { exp_continue } + timeout { catch {close}; wait + return 0 + } + eof { return 0 } } set in_proc 0 } @@ -465,10 +479,17 @@ foreach router [lrange $argv $i end] { } } - # figure out identity file to use - set identfile "" - if {[info exists identity]} { - set identfile [join [lindex [find identity $router] 0] ""] + # Figure out identity file to use + set identfile [join [lindex [find identity $router] 0] ""] + + # Figure out passphrase to use + if {[info exists avpassphrase]} { + set passphrase $avpassphrase + } else { + set passphrase [join [lindex [find passphrase $router] 0] ""] + } + if { ! [string length "$passphrase"]} { + set passphrase $passwd } # Figure out ssh cypher type @@ -484,9 +505,9 @@ foreach router [lrange $argv $i end] { set cmethod [find method $router] if { "$cmethod" == "" } { set cmethod {{telnet} {ssh}} } - # Figure out the SSH executable name - set sshcmd [find sshcmd $router] - if { "$sshcmd" == "" } { set sshcmd {ssh} } + # Figure out the SSH executable name + set sshcmd [find sshcmd $router] + if { "$sshcmd" == "" } { set sshcmd {ssh} } # Login to the router if {[login $router $loginname $passwd $cmethod $cyphertype $identfile]} { |