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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2020-6-21 17:00:01 | 显示全部楼层 |阅读模式
TRANSFER_HOST=111.111.111.111
/ \2 U% F, J% K. _TRANSFER_SSH_PORT=2233
' d! N, c/ ~0 @: ^TRANSFER_USER=my_admin# S2 X8 n6 X" V- \
TRANSFER_PASSWORD=mypassword& }7 @& A. P. D5 c2 N
TRANSFER_PROJECT=/home/my_admin/deploy/transfer/*
5 t8 w2 k8 h% `9 l) `1 CDEPLOY_DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)$ D/ m2 A* S- N" i' o6 |
fuction remote_transfer(){
" [6 z$ x8 P8 H5 g# }7 t7 H! ~    echo "$1"
1 d& n1 ~8 ]+ Z    shift 1" A, |0 w, p$ c
    expect << EOF- {$ M: E7 H: S! b! v7 k! I# C
        set timeout 30
7 t) O7 L4 [: e$ q5 p% Y        spawn $@
3 z$ J. k  _3 t- Q        expect {
; U  e5 Z% r, q" {' s. H            "(yes/no)" {send "yes\r"; exp_continue}5 l, R7 C0 u) m! f/ T  H7 P
            "password:" {send "`echo $TRANSFER_PASSWORD |base64 -d`\r"}
' i, \) E7 C1 N# R* R) U/ B3 B0 h        }2 l. g7 J/ t' d. w1 l, V) [* k9 x
        expect eof 3 |, W& H8 y! @: A- F) z/ `- X0 C
EOF: g* ~2 O9 `; `
}
( {5 X. a: [2 i$ X: J7 nremote_transfer "Download files from remote JumpServer now ......" "scp -P ${TRANSFER_SSH_PORT}  ${TRANSFER_USER}@${TRANSFER_HOST}:${TRANSFER_PROJECT} ${DEPLOY_DIR}"/ Y2 Q, w* }! p" Z

& C5 U/ c  E0 Z2 @* x

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:05:46 | 显示全部楼层
expect执行多条命令
- ^+ j* v7 w! Y" N3 `) i: ^3 Z; ?  i; j0 A$ |5 o/ u$ _. d
复制代码+ A  e$ U, ^  {% H1 z2 k
#!/usr/bin/expect -f
* v4 u2 W/ `: m
  X% A" f  d4 c9 kset timeout 106 C. ]. j# _5 X: G; _/ H

, k" i, p* T# Q2 [' `, |" zspawn sudo su - root
2 L- A% m5 p2 jexpect "*password*"2 G* h% _# J; b2 e% ~7 B& s) B
send "123456\r"
% U  y! j* w- f2 Y( w) Gexpect "#*"
: r- @7 j* y0 u; r3 w- v+ ?$ Csend "ls\r"( W7 K$ q  @; D; F' w& _: T+ |
expect "#*"  T% U( G- B0 r$ W1 S9 ?" y! f. b& m
send "df -Th\r"$ G% J$ r9 c8 C# h7 e
send "exit\r"
* W$ f3 q' G  @4 ^/ @: K. x* Vexpect eof

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:06:25 | 显示全部楼层
shell调用expect执行多行命令.5 l7 N1 }8 W8 _1 X. i
" r5 x: L" T2 Y# M
复制代码
" A' j5 H1 e1 ~" a, Q- b#!/bin/bash
7 D' K5 X, B3 Eip=$1  
/ I$ Y" z( l8 K* w( P  v! E9 Ruser=$2 8 K4 a; l) r2 z! |% o! i
password=$3
/ l; v8 F, n% ]8 E  p
$ N1 u2 S' C/ {. H( Zexpect <<EOF  
! C; l* w) l; [+ q: A    set timeout 10
0 B6 |9 d, z- O7 r. y2 D# o    spawn ssh $user@$ip ( u& ]7 ?/ n' C
    expect { ' o2 c# x, J  w5 o
        "yes/no" { send "yes\n";exp_continue }
3 C4 }3 {( C! z* D( N  ~        "password" { send "$password\n" }
% v( b; y( e; a& Q    }
( T  |) O* H0 y    expect "]#" { send "useradd hehe\n" } 8 L: T4 C' G) }% _
    expect "]#" { send "touch /tmp/test.txt\n" }
( ]% l& v7 X' ~/ n  `3 c7 }6 U  i) y    expect "]#" { send "exit\n" } expect eof 6 R2 }+ [6 C, @. d% J
EOF  . N8 r/ b! n5 S9 `; c9 ^+ u) I- T1 e
#./ssh5.sh 192.168.1.10 root 123456

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:07:11 | 显示全部楼层
使用普通用户登录远程主机,并通过sudo到root权限,通过for循环批量在远程主机执行命令.2 z+ [: G6 A/ W) H( Q
% k% @  u9 q: S
复制代码
/ z6 D& N5 ]* @* D$ cat timeout_login.txt 9 p. s5 Z9 B! c( H
10.0.1.8  h, @: t. f+ K
10.0.1.340 r: N& z3 D' j  V: @
10.0.1.88
( E& `& I4 {& c5 l10.0.1.76& L% }/ F; r: z- K, ?1 W" ]
10.0.1.2
. k& A: B( J4 I5 s7 ~) T9 q10.0.1.3
3 Z. l  g/ F* i  c复制代码
* \5 J1 i9 _: A) \复制代码! d; E( T1 r8 f, [
#!/bin/bash9 M- q$ a  `8 L5 v; U
$ t. a7 t: S" }' N
for i in `cat /home/admin/timeout_login.txt`
% K: x$ P# t  ^' Ldo
- c' f1 J: ?4 S, _  C1 Y' {( u4 U8 ?& H* E6 O  z
    /usr/bin/expect << EOF% x! P7 k" h- J/ J0 s
    spawn /usr/bin/ssh -t -p 22022 admin@$i "sudo su -"
: A9 Q. i; ]0 D% n! O
2 i* H: ^7 G8 N    expect {
& g$ U" {' u; P# g6 E" E' H6 `- q4 a        "yes/no" { send "yes\r" }( [! _# b7 }/ t9 c* ]8 i
    }   6 M4 Z! [- w" Q; v2 y0 g- g

* i; v  k4 R' ^. q( H( e, X( W    expect {" F- z% c5 q! J. |( q/ w
        "password:" { send "xxo1#qaz\r" }
4 N$ u# L9 k% G7 W& O    }
; q3 x# B+ E% U9 f/ ^' C   
) W% V4 |2 t) f0 y8 b2 d+ H( u    expect {1 i" {, C  ^$ j1 n5 D
        "*password*:" { send "xx1#qaz\r" }% M* ]- t% Q4 |# O6 S& g( G
    }
; x4 b( }) G: G% f5 o# u' g1 `: W. d5 Y
    expect "*]#"
* X+ ~) D6 ]" ?* r& i    send "df -Th\r"; c7 K: d/ o( c
    expect "*]#"
2 y6 e/ H9 B) ]+ {, c    send "exit\r"
2 m& O( J+ S. i  j9 k    expect eof
8 D0 O; i- ^- n3 l$ R
5 r' {  w9 ~0 E7 V/ ^8 CEOF0 ?  a5 W4 J1 o* A' P
done5 Z; i' A. d$ j5 X8 a1 Z9 R
复制代码
5 h1 i. n/ G! O7 M3 u: | 密码过期需要批量修改密码
  n' p  T3 c% C0 }  n, u
. u# ?' z4 X- |1 U复制代码
( [& A4 U: S3 T9 l; n4 u6 f#!/bin/bash
9 `- f+ O  M* q
: C- Y" j" g9 L+ N# p' Ufor i in `cat /root/soft/ip.txt`- w" }6 P. J! D
do0 ^7 Y7 i( @  l5 o: N

$ x, e$ h! I2 p( v% k/ G    /usr/bin/expect << EOF  v+ Q; ]9 E& V, i
    spawn /usr/bin/ssh root@$i
" n4 K2 [3 e" t8 s; @8 A/ O' p2 f8 ~# {% t. Q  a7 w! m: Q8 w
    expect {4 y; |/ z! d+ D  ^
        "UNIX password" { send "Huawei@123\r" }
8 K& M$ k: F4 ]; Q3 b9 `( w: X    }3 ]# N6 D1 n! D. G' ]' d3 D" L
   
& P# M2 @5 n' G* i! `% x' f    expect {# E% ~+ V5 {, t+ m
        "New password:" { send "xxHuzzawexxi@1234#\r" }+ e5 T$ o4 Y# ~/ M+ ], J
    }8 j; R: l0 H% p4 }# ?
+ B! \% h5 C+ o" i% M5 ^
   expect {
- B. N9 t) A- n        "Retype new password:" { send "xxHuzzawexxi@1234#\r" }& D. {+ h; y6 {+ b" [1 v
    }
2 d: Y7 \! h- v3 w, E7 p
3 e6 z; l5 O: S5 e    expect "*]#"
  e0 ?: E9 s2 }8 s/ Y2 E6 D    send "echo Huawei@123|passwd --stdin root\r"' F8 |2 E3 z: V! E, C" D: V
    expect "*]#"' a: B7 H* S5 Q
    send "exit\r"8 f  ^5 n; _/ k! \, x) {7 ~( Y
    expect eof* z, q& t8 M) W/ ]8 d9 `; s
EOF& j0 ?/ u! o; l0 v
done

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:07:56 | 显示全部楼层
创建ssh key,将id_rsa和id_rsa.pub文件分发到各台主机上面。( l: H. w. z  S2 J8 q. y
! S6 F- K0 i& l( j/ \+ N
复制代码
0 O& S6 v! x" O1.创建主机配置文件9 q* f' `6 ^; k7 i, q
# m; J7 y9 M2 j/ S3 Z( U9 U
[root@localhost script]# cat host - ^5 f' F$ |( K% h6 B9 ?0 b. Z
192.168.1.10 root 1234560 C: j; M6 M, M8 ?' _' G
192.168.1.20 root 123456
* j1 v0 M) M# W0 t' o  q192.168.1.30 root 123456
. C; W9 L6 Y3 S) }* [% X3 O' C$ z( e3 c' O8 \# T8 d3 q
[root@localhost script]# ls
' Q( ]# c& T% Y! N; jcopykey.sh  hosts0 t9 p) X6 u) a9 c
2.编写copykey.sh脚本,自动生成密钥并分发key.
5 ?% R' t( V8 C' u9 M[root@localhost script]# vim copykey.sh. N9 C5 d% F, c

. i. _7 H. ?% I' I* P#!/bin/bash
3 U1 {; L7 [1 T' ]6 L: s& e
  V6 F) S$ ^9 E  j3 @# q# 判断id_rsa密钥文件是否存在
+ }! R0 Y4 k+ a$ i* y  z& }; N' eif [ ! -f ~/.ssh/id_rsa ];then8 L$ Z6 L+ i, Q9 D$ B' [& i2 i
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa+ j5 [" X8 u& z! D6 W
else
+ t- L  o- l- s% B! W echo "id_rsa has created ...". ]5 S7 y" T+ x' c; X1 L" `
fi
6 T! j5 P9 F, O" K1 D" L$ g8 @
#分发到各个节点,这里分发到host文件中的主机中.
/ Y  G# X" m5 C- {+ ~8 _0 rwhile read line4 \) Q% \: G* ]9 c9 M  W( z1 U
  do" o' C6 c. o, t$ Y! S( z, J  K+ Z
    user=`echo $line | cut -d " " -f 2`
4 ?* `3 y6 r. J* h6 r9 H! T: `    ip=`echo $line | cut -d " " -f 1`
9 w1 H0 H- a: b5 O  a5 x7 Y    passwd=`echo $line | cut -d " " -f 3`
+ a  }6 @/ g1 O) x$ P) o) W   
1 U/ B8 `( v3 o: P1 A: F    expect <<EOF- W6 z2 M" _( a" S1 t
      set timeout 10
5 Z, b$ k- ?8 i( O( O; j      spawn ssh-copy-id $user@$ip6 Y( n" ~) S& `3 i* Z
      expect {6 I) L6 W0 G2 i7 s- x. [- |& l
        "yes/no" { send "yes\n";exp_continue }3 D* [2 h4 P+ f& O( L# p
        "password" { send "$passwd\n" }# I8 K7 Z5 A' I5 f& ?- Q) K
      }: }3 p9 D" o0 ~
     expect "password" { send "$passwd\n" }
- p1 Z" k( \4 s# Y& A8 H5 u% z" G! Q! dEOF; P2 z, _2 g0 Y: M; [/ A+ ]
  done <  hosts

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:08:14 | 显示全部楼层
expect常用命令总结:
! {6 c- Q4 Q  q% A4 O1 F1 f" ~2 m7 `4 S+ A
复制代码2 K; ^9 U/ S2 B$ {
spawn               交互程序开始后面跟命令或者指定程序' }$ v" X" ^1 d
expect              获取匹配信息匹配成功则执行expect后面的程序动作7 m5 I1 ~1 U4 j( R7 {" i$ L
send exp_send       用于发送指定的字符串信息
8 @! C7 [) k0 g2 d' }exp_continue        在expect中多次匹配就需要用到
, y$ j( e2 R* `; p+ Xsend_user           用来打印输出 相当于shell中的echo
, g& e7 G4 ]) h1 J% K3 qexit                退出expect脚本
7 W1 p% R9 |8 l) C( F( y: |2 \eof                 expect执行结束 退出& v5 r) {7 n5 o5 C, J9 ^# p9 o
set                 定义变量, l: }9 J. k- o% i
puts                输出变量0 Q: c, D# x7 J4 ^* y
set timeout         设置超时时间( G' l- R- V) {5 \/ Q

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:08:54 | 显示全部楼层
示例:
9 R$ D: F  U, e) {5 c. A# J# M, _' r8 v' `
1.ssh登录远程主机执行命令,执行方法 expect 1.sh 或者 ./1.sh
, n) e* N' H; R8 O" y6 N
: ]$ ~) B$ Z) g# vim 1.sh ( R1 H1 t8 a2 l1 D6 _
! ?3 i* M% ~! J: f& _3 }8 q
#!/usr/bin/expect) o! p7 V0 p7 S
& z% b5 ~8 H2 U, P2 ?
spawn ssh saneri@192.168.56.103 df -Th
! n4 @  J* e# M) z2 f. kexpect "*password"' t. R# z/ B3 w3 k/ k7 y2 M4 v
send "123456\n"
& y; L) g2 C/ @; ~; c. ?expect eof6 }1 |8 @' n; ^$ p5 l' C  }! Y
2. ssh远程登录主机执行命令,在shell脚本中执行expect命令,执行方法sh 2.sh、bash 2.sh 或./2.sh都可以执行.. [' M( K* }! F% F- ?

; v* c9 h3 S' {  I复制代码
1 {, t+ [* {$ H- C) w! M1 m6 o  C' [#!/bin/bash  w6 x( O* x% z. ]
2 c) m& U9 Y  ~. Z2 {
passwd='123456'* T* f( E8 ~+ n' G. m
! I1 K* C, ~9 X! e9 `
/usr/bin/expect <<-EOF
, G: K5 |% O4 a! ?
; a! s1 K2 _# @5 m2 ~& m% X% m. Wset time 30- ~# F+ @1 d- W( [& Z' v
spawn ssh saneri@192.168.56.103 df -Th
; r1 d; J: D2 T  L: Uexpect {
7 L- Z( T% C/ D% C"*yes/no" { send "yes\r"; exp_continue }8 I" c$ W# m2 r& q1 A9 I% H: p! o
"*password:" { send "$passwd\r" }
( {$ R' X& B" V: U8 i. [; ~}9 |: S: R3 F  N) y9 r' o
expect eof
; J! F  y0 l3 d+ S5 O- s. JEOF
' W/ k; }7 _) H& Y' T. _5 q: ~2 v复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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