ssh两主机互信登录___代码实例

目的:

1) 实现正常通讯的  A主机  B主机 创建 互信关系

2)一旦两主机互信成功,下次登录无需输入密码

实际createSSH脚本参考

#!/usr/bin/expect 
# vi:set ts=8 sw=4 noet sta:
#
###########################################################################
# Description : Create SSH trust relateion automatically between two users
# parameter list:
#        para1 : username@host
#        para2 : passwd of user
# Output:       print run log to screen
# Return:       0:success
#               1:failed
############################################################################

## variables
set prefix ">>>>>>>>>>>>"

proc usage {} {
    regsub ".*/" $::argv0 "" name
    send_user "USAGE:\n"
    send_user "      $name username@host password\n"
    send_user "\n"
    exit 1
}

proc check_id_files {} {
    if {! [file exists $::id_file]} {
	send_user "$::prefix id file does not exits, 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"
    }
}

## 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 6
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 SSH trust relation to ${user@host} already exits.\n"
	    exit 0
	}
	eof {
	    send_error "$prefix Failed to create SSH to ${user@host}.\n"
	    exit 1
	}
	timeout {
	    send_error "$prefix Create SSH to ${user@host} timeout, Failed.\n"
	    exit 1
	}
    }
}
if {$yes_no} {
    expect {
	$ok_string {
	    send_user "$prefix Succeed to create SSH to ${user@host}.\n"
	    exit 0
	}
	-nocase -re "password: " {}
    }
}
send -- "$passwd\r"
expect {
    -nocase "try again" {
	send_error "$prefix passwd error\n"
	exit 1
    }
    -nocase "password:" {
	send_error "$prefix passwd error\n"
	exit 1
    }
    $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 homePermission 700
set index [string first @ ${user@host}]
set index [expr $index-1]
if {$index!=0} {
    set currUser [string range ${user@host} 0 $index]
    if {$currUser!="root"} {
        set homePermission 755
    }
}

set pub_key [string trimright $pub_key "\r\n"]
spawn ssh ${user@host} "cd;chmod $homePermission .; mkdir -p .ssh; chmod $homePermission .ssh; echo '$pub_key' >> .ssh/authorized_keys"
expect -nocase -re "password:"
send -- "$passwd\r"
expect eof

#使用ssh登录一次,校验信任关系是否建立成功
spawn ssh ${user@host} echo $ok_string
expect {
    -nocase -re "yes/no" {	    
	    send_user "$prefix Failed to create SSH to ${user@host}.\n"
	    exit 1
	}
	-nocase -re "password: " {
	    send_user "$prefix Failed to create SSH to ${user@host}.\n"
	    exit 1
	}
	$ok_string {
	    send_user "$prefix Succeed to create SSH to ${user@host}.\n"
	    exit 0
	}
	eof {
	    send_user "$prefix Failed to create SSH to ${user@host}.\n"
	    exit 1
	}
}
expect eof



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值