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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2020-6-21 17:00:01 | 显示全部楼层 |阅读模式
TRANSFER_HOST=111.111.111.111
0 k, o' H. B+ _) m0 E3 yTRANSFER_SSH_PORT=22334 u2 V1 Z# K' P
TRANSFER_USER=my_admin
/ [2 q% ]( k1 z5 Q+ i. tTRANSFER_PASSWORD=mypassword
4 e: P7 u. l" E- D6 XTRANSFER_PROJECT=/home/my_admin/deploy/transfer/*
: D+ }3 v, I  a1 P& t8 [DEPLOY_DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
# i4 T4 K8 j0 U8 b: y$ Bfuction remote_transfer(){
/ P6 k2 O4 q+ Y) Y( r    echo "$1"" B5 D4 E% ^. w
    shift 14 A4 c. J' s" M$ \# l
    expect << EOF0 y5 D: v+ P+ F3 X0 J) @
        set timeout 30
( m! t3 c  i* f( q! d; ]        spawn $@
( ^0 q$ i8 o) @- I7 n        expect {) `7 A& I0 P8 Z9 ?9 k* D. A
            "(yes/no)" {send "yes\r"; exp_continue}
: Z& j. V9 P- z' o- [            "password:" {send "`echo $TRANSFER_PASSWORD |base64 -d`\r"}* Q, T+ O/ Y( l5 @9 r. K# [( w  \, @
        }
  z9 h/ S, r/ l1 n" X) J' \        expect eof . r: b1 Q, D/ z! W" ]! s
EOF
6 W. \; o$ a3 r: n: c" ~}
9 H4 f! V, o; P7 zremote_transfer "Download files from remote JumpServer now ......" "scp -P ${TRANSFER_SSH_PORT}  ${TRANSFER_USER}@${TRANSFER_HOST}:${TRANSFER_PROJECT} ${DEPLOY_DIR}"  r9 W. t. q# _6 d$ g% \7 c

  }; D0 H' R& W, U! H, p& T

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:05:46 | 显示全部楼层
expect执行多条命令
4 `6 M" P2 O# l0 m' ], b5 w- t- |1 @( w) L
复制代码# F2 g5 l# ]* a2 U6 X
#!/usr/bin/expect -f; \6 S$ [4 ^. d8 B$ ]+ R% z

1 `( B- l1 I) z, o3 wset timeout 10
; n1 ~) ]! {+ t
2 S5 ^+ r: k0 z+ Qspawn sudo su - root4 ~; ?5 [. S! p- O* Z
expect "*password*"2 t. h) e( w1 b# Z' |6 u' j( `4 S/ Z
send "123456\r"8 [; l/ S7 D" B
expect "#*", _! d& C% y' Q# U. P5 t8 w
send "ls\r"
5 F0 {8 Q+ Q; Z5 h; N+ d2 Wexpect "#*"+ M! S/ e5 f: b" n
send "df -Th\r"
( `& ]+ @9 j( W# r# Esend "exit\r"
% ]/ k" o7 y; M. `: cexpect eof

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:06:25 | 显示全部楼层
shell调用expect执行多行命令.9 i# i1 j" M9 E( y5 C1 R
+ I2 s2 t2 M7 M( M2 I: a* p8 G
复制代码' n/ V) l3 C# Q! P7 o
#!/bin/bash
5 \3 V/ P$ J  N/ b* |ip=$1  9 T% f1 Y- z" `
user=$2 . N4 q3 I5 x# h7 U; W6 i
password=$3 & `2 H1 a( l6 L' k; g

% ?! I' R6 c  F0 ~4 r; Aexpect <<EOF  ; R2 C8 O; Z& B) \, d' W7 t, k: n
    set timeout 10
6 N5 W( Z) L) h+ r4 Q3 f    spawn ssh $user@$ip
& k5 ~, Z  A/ B  y    expect {
9 i3 K! v" Y3 O$ Q        "yes/no" { send "yes\n";exp_continue }
* H  }" @4 ~% d( z% o        "password" { send "$password\n" }: S$ b* I  M6 S- N3 L/ l
    } ' L( ]& k% ?; ~
    expect "]#" { send "useradd hehe\n" }
) N0 E5 i" ~, b, h& i    expect "]#" { send "touch /tmp/test.txt\n" }
* y5 z! {: S7 U9 U7 S    expect "]#" { send "exit\n" } expect eof   L2 X# v2 f+ z$ n& ^9 c
EOF  
( T$ S- a- F. {  Z #./ssh5.sh 192.168.1.10 root 123456

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:07:11 | 显示全部楼层
使用普通用户登录远程主机,并通过sudo到root权限,通过for循环批量在远程主机执行命令.
& U" o" q! u% w8 y
6 h- F: W) a3 m( \  m9 x$ w复制代码4 W  }9 s2 E2 `, Z4 C( j
$ cat timeout_login.txt
) R1 _" r& _& u4 z% Z10.0.1.8
2 }; O! s# H$ j% m/ `: b$ U10.0.1.34
6 ^3 J6 D$ n5 d10.0.1.88
6 o. i( u7 q0 c5 X( }10.0.1.76
9 j- R- c" u7 n. N: x10.0.1.2
4 h+ a9 n' E- T10.0.1.3& V; W$ W' X$ u- y0 o3 ]$ |# m
复制代码
! D, B( U/ A* @# k复制代码. ^" e! Y; K; ?" w) ?5 V
#!/bin/bash
+ A% J' n1 }6 p8 z* N! e5 K' @# G7 @$ z" }% u9 D# Q
for i in `cat /home/admin/timeout_login.txt`3 R3 _& ]7 V8 ~; ?
do
- e' H3 l4 H3 _9 W1 C
% b9 t& m/ s3 {! h- j) B    /usr/bin/expect << EOF4 f- T2 ]6 N: V- G% ^- h3 `8 r
    spawn /usr/bin/ssh -t -p 22022 admin@$i "sudo su -"
" @- C1 d5 f" w0 ~3 @; _! K! I' y  u6 x% ?6 k. c. w
    expect {+ G# F7 c! G* _( b: C& f
        "yes/no" { send "yes\r" }1 o( H+ P0 f' ?& C% g
    }   
& P* Q5 P# ^  R" z( ]
$ ^' @- N# e& W4 U7 Z    expect {% _. t, w9 A/ \1 O. }
        "password:" { send "xxo1#qaz\r" }+ q0 X7 Q% L1 s( m8 f+ V
    }9 O( `# ]$ R/ o) O* R' x
   
; o% T" a+ G& h$ P1 }' @' C    expect {
) }% ]6 {4 v5 V        "*password*:" { send "xx1#qaz\r" }2 q" N4 k% \) |+ P; a3 `. U
    }5 j  v6 |8 u' b0 b: t: Z8 A7 Q! H4 s6 A
8 U& Q/ A3 ~% J/ ]: v: z( U+ ~( O
    expect "*]#", o5 w! v% I; ?- q. h
    send "df -Th\r"7 M" E( Q+ o8 l
    expect "*]#"0 f  {6 L- {" A+ S& i
    send "exit\r"
) t  x5 C3 s" M+ |8 m. ]  o5 b1 J2 M    expect eof
$ B2 K+ [8 {9 \3 ~/ W* @; [. h( M% J* c- h/ Z# f
EOF
% K' P& L4 |# ~5 udone
5 t9 ?, b6 K9 V7 q# \* g复制代码
& e9 ^  d' y! g# E5 C0 S 密码过期需要批量修改密码
0 a( t5 O  X% F4 R/ H: u4 A/ T$ @$ ?7 q# d* j2 S
复制代码9 L& M8 Q3 u& E. y6 E4 t; s
#!/bin/bash' O  Q( ?, r2 s3 F
, l4 p2 R. {3 M( A0 F
for i in `cat /root/soft/ip.txt`7 |- s5 R1 u/ O+ i; l
do; m- C3 B! i* ]; B3 R4 Y  k; T8 k
$ L* H0 J) n$ v: X) u2 N
    /usr/bin/expect << EOF" T& y- K& h  P& I. ~
    spawn /usr/bin/ssh root@$i
' E/ c1 v4 J, ?8 k  c
, \  O+ g6 r" X6 T    expect {. V% i6 B9 C5 N% D: B
        "UNIX password" { send "Huawei@123\r" }+ x' L- @3 x! h5 q; J/ o! j! m, `
    }
3 k; C9 M, j9 ^& V, j4 t   
+ L# T& Q4 a6 d( C4 h% v2 [    expect {
6 G! x5 _4 ^7 r' ^% K) ~7 h6 [        "New password:" { send "xxHuzzawexxi@1234#\r" }3 x, }) i( P5 x; y4 Q
    }
. Z# E" |+ e: e2 |3 |; L" J$ {: ~% [* j  w+ ~
   expect {& B  W. N& u1 x% f# R/ O  i
        "Retype new password:" { send "xxHuzzawexxi@1234#\r" }: q2 `5 t* L% ^$ ]* _0 f
    }- U9 }/ l& O+ L  v5 D& u

( n3 |/ @- x7 U, o/ D; ?& s" F    expect "*]#"
. S6 L8 w& m4 }" i& _+ J' m    send "echo Huawei@123|passwd --stdin root\r"6 q5 E4 T8 ^! N
    expect "*]#"0 e, W0 R' h, H9 [- Y
    send "exit\r"- ]) m$ f8 b5 @! `/ I
    expect eof$ I  _9 N6 {6 y3 z
EOF
, F" O0 {0 b. a9 L% Adone

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:07:56 | 显示全部楼层
创建ssh key,将id_rsa和id_rsa.pub文件分发到各台主机上面。
5 g3 d1 ~6 X) I) j. l6 t1 j- q9 ]5 Y  i! _3 M$ m8 V5 S. f
复制代码
6 h: p5 B- J, p& a/ S1.创建主机配置文件
' @4 A$ U1 `, S
+ N. L) w+ p+ y* J2 U# M[root@localhost script]# cat host 1 n$ f0 L$ W5 K  v% \- P, G( `3 c
192.168.1.10 root 1234566 U7 `* X- O* U' g- ^$ @
192.168.1.20 root 123456" E1 ~1 F, M) f
192.168.1.30 root 1234568 R9 j* J% i' z  ^: T" ^& ?

3 o2 e% ^: q# u) }[root@localhost script]# ls/ ]& Z: ?+ [' F" \9 m3 W
copykey.sh  hosts5 ^! v' g. ?8 @" w7 r
2.编写copykey.sh脚本,自动生成密钥并分发key.% v( @* r8 x1 i3 O6 m1 ]/ |+ Y. ?
[root@localhost script]# vim copykey.sh& }  i* c# \; B6 h2 `4 R

' J5 T1 k3 u! U- E' v#!/bin/bash' M7 h7 i5 E" C

' s3 w, ^  R& L# 判断id_rsa密钥文件是否存在, X# E+ T" b) H6 H% h
if [ ! -f ~/.ssh/id_rsa ];then% j! \3 C1 K- G  n2 K
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa& W% ^, o# u+ R
else
3 E3 e! Q, F' n% G. c echo "id_rsa has created ..."* z& n+ K6 m# f. x% y$ t  W
fi8 x$ r1 \  u2 t0 u3 f9 r$ w1 X
* N) T: D6 i/ L( O$ m8 V
#分发到各个节点,这里分发到host文件中的主机中.8 d1 o  b  i9 z
while read line
. m+ U+ E7 ]! v. ^" ]8 K) ~) F  do
. v- }' I9 K$ @8 w- Z% e    user=`echo $line | cut -d " " -f 2`
; O9 t8 }( r# P( \; a    ip=`echo $line | cut -d " " -f 1`
1 y; d* O( R8 Q8 n7 {4 N/ n& E    passwd=`echo $line | cut -d " " -f 3`/ W: o: G3 v) R6 b" o, h
   
2 Y, K) j- x$ \5 m& X' k    expect <<EOF- ?, U* b9 J9 P- @; V
      set timeout 10) j$ J/ d4 i7 @1 b* W
      spawn ssh-copy-id $user@$ip0 F3 o1 B4 w% x
      expect {4 H* g( C- e- w& @8 v4 e8 H
        "yes/no" { send "yes\n";exp_continue }
7 M- [2 S$ t- l, c, |6 s- d        "password" { send "$passwd\n" }
* h8 R3 y' t9 B8 d% \; s      }
) o) B# Y  O) |7 E     expect "password" { send "$passwd\n" }6 m5 |$ O% V# e0 n8 [  o! Y
EOF
( \) M) b, J+ a1 U3 _, h' O  done <  hosts

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:08:14 | 显示全部楼层
expect常用命令总结:
) |/ \; L# ]' y
- `6 L7 h5 w2 t% ^0 k% x复制代码
) c/ l$ d9 ]- f8 {3 f9 H) Y0 zspawn               交互程序开始后面跟命令或者指定程序
/ U7 {! t/ ?( o- y; Z7 _: Nexpect              获取匹配信息匹配成功则执行expect后面的程序动作
! c- U# ?# d4 b* }send exp_send       用于发送指定的字符串信息. q3 A* m1 v* [* L! s$ n
exp_continue        在expect中多次匹配就需要用到
/ B2 F' w2 |! K" _2 E! y1 Q. bsend_user           用来打印输出 相当于shell中的echo
9 q9 W+ ^6 R# |0 R1 sexit                退出expect脚本5 [0 V5 \9 @6 P4 B4 U/ M' @
eof                 expect执行结束 退出$ x' r1 F; m. i1 z4 x
set                 定义变量( T6 a+ l* C/ r  m
puts                输出变量
1 A( @) b* K( R3 zset timeout         设置超时时间
! O9 H% h# [3 }. B3 x. A+ c

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:08:54 | 显示全部楼层
示例:
* |% r) W+ {: q4 z( Q& F1 g- o1 d' s- j2 T5 _% K
1.ssh登录远程主机执行命令,执行方法 expect 1.sh 或者 ./1.sh0 j- i. B9 a) o  r

6 U' |1 I+ Q( f2 |; U$ n4 e8 @! [5 z# vim 1.sh
& s, M* W- Z* J: T. k  a' ^0 U$ c8 Z: U! k: ^' ]& a# k
#!/usr/bin/expect
* i+ Q2 e, ?) V$ F) N9 B4 l
+ x: p8 c6 C: P; d9 tspawn ssh saneri@192.168.56.103 df -Th% J; h2 a: W5 k3 i! g) ?
expect "*password"1 M' n4 Y: c" k  j+ F  w9 K+ t
send "123456\n"9 j; H* D5 [$ [8 |. j
expect eof* F' K- W6 A5 d) q
2. ssh远程登录主机执行命令,在shell脚本中执行expect命令,执行方法sh 2.sh、bash 2.sh 或./2.sh都可以执行.3 _+ B0 _# B6 L* u

2 D4 h: w) T3 G4 |( \复制代码5 `) E# U4 g. S# ^5 q2 x) ]
#!/bin/bash, x8 E) G' b2 W( P4 Z  E! F

6 x, v3 d1 G) W0 ypasswd='123456'
* a8 N- F3 j% V7 x8 h3 Q% |- }5 J! p0 f/ H5 b
/usr/bin/expect <<-EOF
7 M9 [/ _) O, c+ D! T' a: G4 P. C) A5 y% }! F- L+ q6 M
set time 30
3 z8 t" D# ]: ?& n/ v& K# Xspawn ssh saneri@192.168.56.103 df -Th$ a0 e0 z2 O9 B3 z, m. f3 A5 p# B  S
expect {6 G2 [. q: u8 z
"*yes/no" { send "yes\r"; exp_continue }: l3 c: t) J. h  k7 `0 \
"*password:" { send "$passwd\r" }' g: ~1 g/ _% ^6 o
}) t& p% R, m' r/ v* @/ V$ ^
expect eof' ^; {# v# X$ X, {, m1 ^8 T0 t
EOF9 J/ V6 M5 H5 v' \
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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