- 论坛徽章:
- 1
|
#!/usr/bin/expect -f
# vi:set ts=8 sw=4 noet sta:
#
# Author: dearvoid (MSN: dearvoid@263.net)
#
# $Source: /AS_ATAE_CVS/ATAEV100R002C01/Code/SOLUTION/ora11g_x64_rac/rac-conf/enable_auto_ssh.exp,v $
# $Revision: 1.1 $
#
## variables
set prefix "\033\[1;31m>>>\033\[0m"
proc usage {} {
regsub ".*/" $::argv0 "" name
send_user "Usage:\n"
send_user " $name \[user@]host password\n"
send_user "\n"
send_user "Report bugs to <\033\[1;31mdearvoid@263.net\033\[0m>\n"
exit 1
}
proc check_id_files {} {
if {! [file exists $::id_file]} {
send_user "$::prefix id file not found, try creating ...\n"
if {[catch { spawn ssh-keygen -t rsa } error]} {
send_error "$::prefix $error\n"
exit 1
}
expect -nocase -re "\(.*\):"
send -- "\r"
expect -nocase -re "passphrase.*:"
send -- "\r"
expect -nocase -re "passphrase.*again:"
send -- "\r"
expect eof
send_user "$::prefix id file successfully created\n"
}
}
proc remove_known_hosts_entry {host} {
regsub ".*/" $::argv0 "" name
set tmp_file "/tmp/$name.tmp"
set known_hosts "$::env(HOME)/.ssh/known_hosts"
send_user "$::prefix trying to remove '$host' from ~/.ssh/known_hosts ... "
if {[catch {
set fd_known_hosts [open $known_hosts r]
set fdTmp [open $tmp_file w]
while 1 {
gets $fd_known_hosts line
if [eof $fd_known_hosts] {
break
}
if [regexp "(\[^, ]+,)*${host}(,\[^, ]+)* " $line] {
continue
}
puts $fdTmp $line
}
close $fd_known_hosts
close $fdTmp
file rename -force $tmp_file $known_hosts
send_user "OK\n"
} error]} {
send_user "failed\n"
send_user "$::prefix $error\n"
exit 1
}
}
## get host and password from command line parameters
if {[llength $argv] != 2} {
usage
}
set user@host [lindex $argv 0]
set passwd [lindex $argv 1]
## create public key file if not found
set id_file "$env(HOME)/.ssh/id_rsa.pub"
check_id_files
## ssh to host
set yes_no 0
set ok_string SUCCESS
set timeout 5
set done 0
while {!$done} {
spawn ssh ${user@host} echo $ok_string
expect {
-nocase -re "yes/no" {
set yes_no 1
send -- "yes\r"
set done 1
}
-nocase -re "password: " {
set done 1
}
$ok_string {
send_user "$prefix ok\n"
exit 0
}
"@@@@@@@@@@@@@@@@@@@@" {
expect eof
set indexOfAtSign [string first "@" ${user@host}]
incr indexOfAtSign
set hostname [string range ${user@host} $indexOfAtSign end]
remove_known_hosts_entry $hostname
}
eof {
send_error "$prefix failed\n"
exit 1
}
timeout {
send_error "$prefix timeout\n"
#modified by z60006453 for problem AB6D00409 and AB6D00410 start
exit 16
#exit 1
#modified by z60006453 for problem AB6D00409 and AB6D00410 end
}
}
}
if {$yes_no} {
expect {
$ok_string {
send_user "$prefix ok\n"
exit 0
}
-nocase -re "password: " {}
}
}
send -- "$passwd\r"
expect {
-nocase "try again" {
send_error "$prefix passwd error\n"
#袁乐林修改密码错误退出码开始
#exit 1
exit 11
#袁乐林修改密码错误退出码结束
}
#李博修改问题单A01D71511开始,解决密码输入错误时,再次输入密码的烦琐,改为仅有一次输入机会
-nocase "password:" {
send_error "$prefix passwd error\n"
#袁乐林修改密码错误退出码开始
#exit 1
exit 11
#袁乐林修改密码错误退出码结束
}
#李博修改问题单A01D71511结束
$ok_string {}
}
expect eof
## append public key file to remote host's ~/.ssh/authorized_keys
if {[catch {
set IDFILE [open $id_file RDONLY]
set pub_key [read $IDFILE]
close $IDFILE
} error]} {
send_error "$prefix $error\n"
exit 1
}
set pub_key [string trimright $pub_key "\r\n"]
spawn ssh ${user@host} "cd; mkdir .ssh 2> /dev/null; echo '$pub_key' >> .ssh/authorized_keys"
expect -nocase -re "password:"
send -- "$passwd\r"
expect eof
send_user "$prefix gook luck\n"
## THE END
|
|