找回密码
 注册
查看: 3420|回复: 6

远程登录到server上,并执行指定的操作 配合spawn和expect

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2020-6-21 17:00:01 | 显示全部楼层 |阅读模式
TRANSFER_HOST=111.111.111.111
1 \2 {& H4 Y5 O+ z! K6 iTRANSFER_SSH_PORT=2233
# W+ L5 t4 W, S+ I  P* v0 h/ R2 zTRANSFER_USER=my_admin# V, V# D/ S8 u# G5 M' `9 A: b
TRANSFER_PASSWORD=mypassword
% D0 E3 l( T' Y8 ]' \! v8 GTRANSFER_PROJECT=/home/my_admin/deploy/transfer/*0 ]& D+ R, f% M: `5 i. p4 N
DEPLOY_DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)9 X1 S. M: b& m3 ^9 N; C4 j9 L
fuction remote_transfer(){3 b# X. K/ Z+ x% D
    echo "$1"1 s' q# p7 {) z+ |; U; M  e8 [0 n
    shift 1/ @% b5 h$ u3 ~
    expect << EOF
& C. b$ v- _6 M8 `8 i- D0 d  ~9 \9 B        set timeout 30
3 `9 J0 ^1 n) e9 j* S% w        spawn $@  v! S+ s9 \5 ?, G) f6 t9 z
        expect {1 ^1 X1 I9 N+ Z; `: z- q
            "(yes/no)" {send "yes\r"; exp_continue}" J: J5 d2 ~; M7 j3 U3 M
            "password:" {send "`echo $TRANSFER_PASSWORD |base64 -d`\r"}
) E& {" ?+ x: o9 k        }: f! w. N0 T8 v4 M+ E
        expect eof 3 I, P0 ?3 ^/ U' b- ]2 I* \
EOF6 r' @4 M. k; Q& f5 J' o0 g7 d) k- s$ W
}
: N, x+ F+ `) {# l" hremote_transfer "Download files from remote JumpServer now ......" "scp -P ${TRANSFER_SSH_PORT}  ${TRANSFER_USER}@${TRANSFER_HOST}:${TRANSFER_PROJECT} ${DEPLOY_DIR}"
3 c- n$ O6 Z+ _4 M
2 q, V* J) z1 E

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:05:46 | 显示全部楼层
expect执行多条命令
/ f, ~) e6 K/ K" r# x, J+ O
) z4 Q9 y6 d& M! L7 V复制代码
' L2 C0 T5 w/ @) a3 @1 @5 i0 J#!/usr/bin/expect -f
6 t7 s+ ?% ?/ Q# y# T$ F( {0 X* L  ~6 R6 B
set timeout 10! [! o! q0 X4 L8 q
/ e6 r6 L4 K; s0 v4 d4 `
spawn sudo su - root
& l- ~5 u) ?2 d  M; ^* yexpect "*password*", d: d  \: `5 q" j  W9 a" V
send "123456\r"! v& @$ d7 h" R+ A
expect "#*"
, [  k/ n0 E6 p% Z( ~send "ls\r"
2 ]: l3 a! t- {& G; k$ Q% Uexpect "#*"
" o; @" I$ M+ Q( \2 F  [3 ssend "df -Th\r"
& j+ i3 ?: [+ J. j7 esend "exit\r"
/ @+ c6 Y$ N) A& \expect eof

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:06:25 | 显示全部楼层
shell调用expect执行多行命令.& \5 U$ w0 V1 Q
6 S7 H  |6 y/ E7 p
复制代码7 f5 J, x4 {. I$ |- n
#!/bin/bash 2 x, R' V: A5 o- ]
ip=$1  8 W- g" r3 k7 B: I. S
user=$2
. V8 q' B' J* D" i7 Cpassword=$3
5 [) u: V- L! j$ {# Y
9 F7 @! w$ ~5 K! yexpect <<EOF  
: u! X. J  a3 \9 R9 X3 m    set timeout 10
) P) L6 u8 C7 U    spawn ssh $user@$ip
# }9 l" O# j0 H5 x) _! u    expect {
2 W0 k3 ?9 H% F' v" N7 [* R( y        "yes/no" { send "yes\n";exp_continue }
4 @, N9 x. n% p8 ~5 o8 z        "password" { send "$password\n" }
$ L6 X& a& k0 H" R+ s2 L    }
2 e  C* N1 @4 i( D    expect "]#" { send "useradd hehe\n" }
, d# X: i5 U) G    expect "]#" { send "touch /tmp/test.txt\n" } 7 F; {" f+ d6 _( _
    expect "]#" { send "exit\n" } expect eof 6 ]$ o0 m7 `* r; ^' c
EOF  
  Z! g1 u" U8 J+ Y #./ssh5.sh 192.168.1.10 root 123456

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:07:11 | 显示全部楼层
使用普通用户登录远程主机,并通过sudo到root权限,通过for循环批量在远程主机执行命令.: w) V% L( a! A2 B

2 O& N. P% ?* [; J" H2 j复制代码
4 u& j! O1 d. a; @3 {# h$ cat timeout_login.txt % m& O$ [& T& I- S) z: {. W
10.0.1.8
+ Y1 Z. x7 k/ S' y10.0.1.34
, W- p5 x) \0 p( E5 X10.0.1.88- O' m7 g8 t  X7 V) Q2 p& a
10.0.1.76
) T3 b' k- M% F% t" [, B  Z10.0.1.2
6 r+ N0 t0 X4 a, u; w5 {; R/ P10.0.1.3) D5 V9 A% x8 h- [: C/ U/ j% L
复制代码
! i1 m1 X( c# _& I复制代码
& A4 q7 l  ]& K$ Y& S  g#!/bin/bash
( s! f+ l2 k1 [) q( o! ^* A  u
9 e% u% }+ Y+ Z5 ~* E( yfor i in `cat /home/admin/timeout_login.txt`
& I$ ?5 p" O3 @: }8 \1 N4 U+ `- {+ vdo5 V: R+ I) @) r

$ T4 k/ \* e/ g$ W' y    /usr/bin/expect << EOF
! b' b5 y6 t! z: e3 c3 X7 ]    spawn /usr/bin/ssh -t -p 22022 admin@$i "sudo su -": j$ u$ ?4 {1 C/ \) T- b
2 {7 L% E# t" C. {% n) I
    expect {1 c  h4 s2 i6 K& C
        "yes/no" { send "yes\r" }  v" q$ T4 \0 \& X  P% a
    }   
, F- {6 C5 g: u# ^- a5 x7 K  w- P5 P! w# C+ N
    expect {6 j; ^/ ~0 `  A% }7 X
        "password:" { send "xxo1#qaz\r" }3 P! R7 W8 _3 B/ _( {4 \
    }
2 n# V4 ?. {% x5 Q' [; o5 s: d   
8 t8 I: U7 h! y    expect {6 Z: X8 L; T# n& l
        "*password*:" { send "xx1#qaz\r" }/ ~% g* e- u) m8 ^3 l
    }! @0 X0 f. x' I! \- D

5 i5 i8 ~5 M6 Z    expect "*]#"
- n( c. R  i8 f; G% N    send "df -Th\r"
" U* a. I" a9 e: E0 c9 r$ ^  u    expect "*]#"
. u" m0 D2 ~2 l2 r' Z, k    send "exit\r"( f1 W, Y4 [7 B7 }
    expect eof
- H( u+ `2 c7 U% T$ _( |" H' G! @
' E% z: e' _. ?  pEOF
7 [. k1 D; X/ n" Ddone
" N6 M3 J* j! K. T; q复制代码
& }- h! F, a# v2 ]0 I8 R7 y 密码过期需要批量修改密码# j7 ^1 y3 s5 `7 y  K. ^

& G1 P  r2 o4 ~- O# V% O复制代码1 _6 R, e0 U9 x6 p' o
#!/bin/bash
: N; o' f- i1 Z! K- z" b2 l5 E- g3 S+ c) q' [1 k
for i in `cat /root/soft/ip.txt`3 G4 S+ r, J  j9 n1 }) a) k& k
do
- V7 ]; D2 J3 b
2 O. p$ _8 V6 W1 @    /usr/bin/expect << EOF
' M. l: H. v6 ]: D/ z2 ?. r    spawn /usr/bin/ssh root@$i: M3 V8 G$ j5 `" ?2 S
8 e2 X8 O4 J/ A/ Y1 ]* X. V
    expect {
0 I0 S6 ?& }5 d) w        "UNIX password" { send "Huawei@123\r" }% f" S7 p% ~' y. y7 w. i2 \
    }$ O% a( e8 i! u0 {
    $ x: ?0 M: J% ?3 N: ^3 F0 c! [
    expect {" |/ o  X1 p+ Z+ s" N
        "New password:" { send "xxHuzzawexxi@1234#\r" }
! ^: B! P6 Q4 y$ `* |! B8 b. I: W9 p    }* i  C$ i- V) {1 \4 X

# y0 S7 {! n' D! Y8 L) A   expect {0 \6 i5 E; w- V5 Z! A) X
        "Retype new password:" { send "xxHuzzawexxi@1234#\r" }
3 w6 ^/ V( ~# c    }
+ \/ z+ U) y9 x) l3 d) z
/ s4 Z. H& ~+ A+ W/ \) w# K; y* t+ t    expect "*]#"
8 g! H7 J7 {" R6 W9 J    send "echo Huawei@123|passwd --stdin root\r"
, y5 u$ [  \/ t- A  x    expect "*]#"
% L1 E2 f: F! _: l% B3 w$ h    send "exit\r"" [: o, X4 ~: ]% V5 {3 q/ t  A, i
    expect eof
) \. D" m. N% a* `EOF
, {# k$ `' @- c/ ?1 o' N! p8 s& ?5 Adone

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:07:56 | 显示全部楼层
创建ssh key,将id_rsa和id_rsa.pub文件分发到各台主机上面。) b8 w6 w5 m  m; T
6 O1 o3 x8 [( x$ G+ p3 _( j5 v* ?0 o
复制代码
% z: Q; E% m% z# d; k0 Y1.创建主机配置文件
4 ]% F0 b! A  L; B1 z- R' \, Z, T" \
% g) _: G, O% C. L[root@localhost script]# cat host ) s4 x( a5 H2 Z6 o& z
192.168.1.10 root 1234560 h( r! N/ t! A- t! ^
192.168.1.20 root 123456) s# P5 \7 n! J
192.168.1.30 root 1234564 u4 D: U- Q6 G" Y- {- R
7 e% f/ j" x% J4 r0 v  [
[root@localhost script]# ls9 W4 N) z8 Z) I" s
copykey.sh  hosts8 q" o9 r- j: Z  b1 x( V4 Q: j. n
2.编写copykey.sh脚本,自动生成密钥并分发key.
* C1 u3 ]0 b6 S7 ]/ {& V[root@localhost script]# vim copykey.sh7 G* \) Z  M3 M2 A8 C  L  T

" z: Y. x# l; K0 D1 [( R4 E#!/bin/bash# O3 y1 O0 O! X: C
1 {/ V$ M3 r" I/ ]
# 判断id_rsa密钥文件是否存在
0 n8 }! D/ S! [2 H) e. b4 G( cif [ ! -f ~/.ssh/id_rsa ];then
" l* t3 r7 R# i8 p& t. t ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa5 l" O( J" m  E; J0 b/ x. u2 i1 H
else
8 q% }  w! Z& W4 o7 s. W echo "id_rsa has created ..."
7 r7 x6 @( d0 |+ s8 p8 V9 ?fi2 K+ \$ E/ q: |; ^6 ~

$ O& Z9 C, w8 s/ Q. U( K6 A- V#分发到各个节点,这里分发到host文件中的主机中.
2 w( e, Z2 V, p3 mwhile read line
3 l$ ?  ?$ d7 M: e  do
3 s7 V1 x, A2 v* Y    user=`echo $line | cut -d " " -f 2`+ p1 `7 `6 ~- N4 x- F0 }. u
    ip=`echo $line | cut -d " " -f 1`1 a) l8 J- Q' W2 k
    passwd=`echo $line | cut -d " " -f 3`
, X7 ~7 V! Q8 a" Z/ n& c# B) m4 }   
7 l* ^) B7 y( I2 B    expect <<EOF
$ B6 g  X( E! [0 \3 G      set timeout 10+ ~0 G9 B( n7 e: l- A6 K: z4 I
      spawn ssh-copy-id $user@$ip
, t7 A( ?! b) k- v" a1 ]      expect {
8 i: U% I  P2 u5 s1 j! v        "yes/no" { send "yes\n";exp_continue }
1 H/ ^- E2 W6 P! P+ j4 A        "password" { send "$passwd\n" }/ I& H# p+ |6 O/ o! B  s5 Y# Z
      }
# S% L+ i; P/ x$ Y- a7 Q# t     expect "password" { send "$passwd\n" }6 ^$ `( Z' z+ r- \% q" ^, F- h# ^5 ^
EOF
+ f" o) D4 z$ a' C  done <  hosts

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:08:14 | 显示全部楼层
expect常用命令总结:
* y( \1 K$ z$ G3 p. _- v# l3 T0 a3 F& y( b, Y9 p4 c7 U
复制代码
$ B3 [8 k  ~/ m( S# J6 n7 q' L* Gspawn               交互程序开始后面跟命令或者指定程序3 Z/ Q+ y1 Y9 f0 s* ~: r3 A( r
expect              获取匹配信息匹配成功则执行expect后面的程序动作
8 c6 T' H( I3 E% Dsend exp_send       用于发送指定的字符串信息) a+ q$ G8 K( k+ F& [& F+ G
exp_continue        在expect中多次匹配就需要用到
* ~& l8 b, t$ k* H  {; R. \send_user           用来打印输出 相当于shell中的echo
. [3 |9 O# a1 j. P  Kexit                退出expect脚本
- `3 |) E6 P  p( B: ~" X- Seof                 expect执行结束 退出
+ e# ?8 R" m: ?set                 定义变量
0 B' y2 Z5 d1 s; {/ N) d/ D) Bputs                输出变量- J6 r. Z0 d" Y  g" ?. m
set timeout         设置超时时间* D2 T3 q5 \: c' F' t4 h

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:08:54 | 显示全部楼层
示例:" @) P" Y8 d# B
2 X$ i( w- ?  k  m% n
1.ssh登录远程主机执行命令,执行方法 expect 1.sh 或者 ./1.sh
5 E6 a. d3 _. |: q: n/ {' \! ^  b' P6 A6 X: V1 v
# vim 1.sh
, ^& k* E: m2 _4 ~6 z) i
7 @  [; ?' _1 s  `. e' v8 ^: |#!/usr/bin/expect
; c4 }9 ~  m0 x0 r) h, h5 V7 u4 x/ r$ }( L+ k; ?# _
spawn ssh saneri@192.168.56.103 df -Th
" I* d0 ]# d+ Q2 I9 n* g' n2 fexpect "*password"4 m. i% N$ X) `$ @7 o% z. ~7 {
send "123456\n"
) d7 }  O) E4 Vexpect eof
5 U$ ^5 r" p7 X2. ssh远程登录主机执行命令,在shell脚本中执行expect命令,执行方法sh 2.sh、bash 2.sh 或./2.sh都可以执行.' g) @$ ]  H! o* P
. B/ G4 x' N6 s/ ]  q3 z% i
复制代码
1 Z! o, x( P5 s#!/bin/bash
/ n9 ^3 P9 z9 |" O; q7 y% M- }( c; Q
8 @1 @7 c) Y& t, }/ ]* Opasswd='123456'8 A; r: u2 P( @+ x

" e6 k* m, A/ }( i$ s, Z( {; {/usr/bin/expect <<-EOF0 e: o# a: V" j" I; @

+ ^% P( c$ [/ E  aset time 30: z6 [" D* N( c# n, g$ l
spawn ssh saneri@192.168.56.103 df -Th$ B: X+ k/ ^! |% }5 ?! k* z& }
expect {
$ s9 K4 N: Y. q1 O+ D3 ]0 j* C"*yes/no" { send "yes\r"; exp_continue }2 @' y, S1 M  j3 j; T& w& e
"*password:" { send "$passwd\r" }
1 t" g: H: S/ j% y4 u4 c' P}" Z6 V$ g) H$ H- c7 b6 w
expect eof
" x* F+ `# M/ IEOF
, h9 h  @; @% V& O复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 03:24 , Processed in 0.022080 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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