a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 100|回复: 0

[综合辅导] Linux认证之使用expect实现ssh自动交互

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux认证之使用expect实现ssh自动交互
6 E! L& c* t9 S; k使用expect实现ssh自动交互9 y: Z. h' M: G/ g: S: |" Y' D8 O
下面是使用expect实现的自动远端命令执行的脚本ssh-exec:3 G' m, u8 @2 N6 d5 W% x+ ~3 q& C
#!/bin/sh& K- T$ Q3 t; c+ K1 a
# \+ ?. ]5 @5 s" h  x( e8 ]
exec expect -- “$0” ${1+“$@”}! t/ |1 P3 U1 [0 T, p4 o
# ssh-exec host user password command
; X+ v" J4 a, s3 Q4 Z# execute command on remote host% m7 t  q9 ]# h- r
exp_version -exit 5.05 e. e0 l1 |% V- N
set ERR_PERMISSION_DENIED 1
7 P: R- k) C4 C/ [5 Q8 qset ERR_DIR_OR_FILE_NOT_EXIST 2
2 a# A) K. b# fset ERR_TIMEOUT 3
  P$ p9 z$ s+ l5 T% E# Dset ERR_CONNECTION_REFUSED 4; W% L; }  V1 ?  e$ C2 {, _
set ERR_INVALID_ARGUMENT 5
6 }- D$ c4 P. X( xproc auth_trans {password} {% }2 z9 D1 W! z" x
upvar #0 ERR_PERMISSION_DENIED ERR_PERMISSION_DENIED) a! G( Q+ z/ B; z; C, x' X
upvar #0 ERR_DIR_OR_FILE_NOT_EXIST ERR_DIR_OR_FILE_NOT_EXIST
- V3 Z4 T# }! o/ n) {' a$ l* Nsend “$password\r”3 N: Q( h1 c8 ^: Z
expect {
8 N9 D* Z$ @. }& p4 L6 b#password not correct: E$ f2 t, v: _  q. S
“Permission denied, please try again.” {
  x! A' P) G+ P- h7 wexit $ERR_PERMISSION_DENIED3 f2 Q6 D# s- I- @5 O
}
5 L6 _; y+ N, I$ ~! u# 。..transmission goes after.。.
; b" V1 v; K3 E-re “Is a directory|No such file or directory” {7 T; [2 H6 W* k" r2 I
exit $ERR_DIR_OR_FILE_NOT_EXIST
' B- V$ q. M7 q: Z9 V5 J  F}
5 @  T. Q$ C9 C-re “KB/s|MB/s” {; e" B, x# [6 j8 Z/ ?
set timeout -1# {! M" D+ W9 [3 u* c8 G) X$ P
expect eof
9 }; d+ {' n/ u/ M* H}6 u, ]& t$ f2 v+ G2 h+ K% B. R
}" c; p* N9 V4 {0 Z$ J' e  M
}+ a2 A6 ^& q1 j5 G
if {$argc!=2} {- _- ~" ~- ^9 _) t! S; `6 W5 Q* p! m
send_user “usage: remote-exec command password\n”# }, X5 c4 k. P+ |* v: G1 D
send_user “ command should be quoted.\n”$ p; `& i' ^1 {- O
send_user “ Eg. remote-exec \”ssh ls\\; echo done\“ password\n”7 r* k4 ~4 }( P
send_user “ or: remote-exec \”scp /local-file :/remote-file\“ password\n”
( k% [7 w) K4 a& |% o2 E% wexit $ERR_INVALID_ARGUMENT$ z1 U0 u$ H& i  F' z8 u
}
0 z3 i5 }! a" A7 s  `% X5 a, G2 v$ ~4 \" P# O7 C" z1 U+ _9 m
set cmd [lindex $argv 0]0 w; {1 U0 p! E7 R5 ]/ ?9 N
set password [lindex $argv 1]
2 D% j: @# r+ B. \$ j5 u6 q1 }0 z* meval spawn $cmd) d) E" x9 m2 d* }( C, j
#timeout in sec, default 10% v+ ~$ ~5 O+ c( h* K. F1 x) T
set timeout 301 D* O# k9 D* @2 ]
expect {
  ?: P0 d( [* u' R#first connect, no public key in ~/.ssh/known_hosts4 l3 B( ~+ X* R: Y; ?
“Are you sure you want to continue connecting (yes/no)?” {2 r/ t3 w( M' b6 x5 R
send “yes\r”
; L- a; P$ _" S4 D( L9 `. F" c  lexpect “password:”
6 q9 R- p1 J- s+ {9 b/ B* hauth_trans $password/ F& t. ]2 a' \9 M1 x
}( N! [, Z5 y3 @$ L- I
#already has public key in ~/.ssh/known_hosts. f4 ~, T6 `1 y) f# v# X
“password:” {
2 m0 `0 i' `9 |: zauth_trans $password/ v5 x3 n0 u* c$ a3 v
}5 N! |7 ~* B: G- s% `0 S
#user equivalence already established, no password is necessary
0 j3 C: P# V, T# H- y7 r, P% j$ c# w-re “kB/s|MB/s” {
5 @2 o4 {- s9 Rset timeout -11 u7 i* |* C7 K' Z- ]  T" x" w" l
expect eof
4 t" i' i7 E' |, W: g, V2 Q}4 c+ R- f  y( x7 N
-re “Is a directory|No such file or directory” {  T' E3 T( s7 \# _& L
expect eof4 Z# W1 S7 G( A/ o5 x# i" S
exit $ERR_DIR_OR_FILE_NOT_EXIST
" R5 ~; i; s2 N1 V! s& r2 y% @6 k( R}
0 N9 o) k( T$ Y“Connection refused” {
. R+ i1 W' G7 I  K2 L! Jexpect eof, u$ x/ o4 V; Y& e$ h- t" p8 T
exit $ERR_CONNECTION_REFUSED
) i* n5 f$ B" A! w3 `}
& s- O* H1 f6 G#connetion error. g2 l! c5 [8 ~
timeout {; j9 c2 ?; L0 E; D3 J3 }
exit $ERR_TIMEOUT/ y, M" z2 u8 r- _  ]* F
}
9 t3 ]% {/ I" a}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-21 15:19 , Processed in 0.282274 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表