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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2020-6-21 17:00:01 | 显示全部楼层 |阅读模式
TRANSFER_HOST=111.111.111.111
8 B9 }8 L, v: y' V  W, u8 dTRANSFER_SSH_PORT=22336 z) F6 \$ M4 l% v5 K
TRANSFER_USER=my_admin
- X# b8 r* J6 R2 UTRANSFER_PASSWORD=mypassword5 R( i1 ~) E! @! u% t
TRANSFER_PROJECT=/home/my_admin/deploy/transfer/*
# ^8 n( M8 C5 J( q$ sDEPLOY_DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
. {4 P3 u4 D4 |; ?7 V, ~8 v% Afuction remote_transfer(){# W$ O% _% e# a
    echo "$1"/ ]' a- J0 r/ I5 a5 R" v8 [
    shift 1& t* ^: S( n) u& c
    expect << EOF
) F4 U7 p5 P$ M4 K8 O        set timeout 30& a5 [4 ~' t& b8 S( s) J
        spawn $@( `8 `7 C( b7 w' r, @
        expect {6 j3 t$ }2 X& c
            "(yes/no)" {send "yes\r"; exp_continue}
5 v: Q) Z' |! u) ^  ?            "password:" {send "`echo $TRANSFER_PASSWORD |base64 -d`\r"}
7 z: L2 Y' t$ y0 M- k' W: R7 z! R        }
) N& Y% f; s3 }+ W( \        expect eof , K7 h& Q2 q  e4 o( I
EOF% N3 J; V/ U* T$ \9 t
}
+ d+ d1 ~; v2 z5 Bremote_transfer "Download files from remote JumpServer now ......" "scp -P ${TRANSFER_SSH_PORT}  ${TRANSFER_USER}@${TRANSFER_HOST}:${TRANSFER_PROJECT} ${DEPLOY_DIR}"
) G) j  ~! Z" ?! q- D4 o4 t5 B! Z7 P) j% s" W6 {4 D9 p

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:05:46 | 显示全部楼层
expect执行多条命令( u8 y% r1 a( V( A, b2 u( \6 E
8 D+ x4 t" s  K  B0 j  F# Z, k0 D
复制代码
. K, y; k% {0 s8 ]#!/usr/bin/expect -f. t1 C4 D9 P  I. I( X" w

) `" ?2 m6 w+ W9 T5 f9 D! h+ jset timeout 10
; O. F8 x: D. B- @8 ?& \' x$ a5 [& ]. b  t) |
spawn sudo su - root
2 C2 @7 |7 o. G: ~) w, V8 P. Yexpect "*password*"
4 a7 j/ z  _- m# F9 e: \send "123456\r"9 }% O5 T& h3 \: n0 C- A- {
expect "#*"
  v* {3 B" b$ ~6 Asend "ls\r"
8 A9 @6 h* U7 Fexpect "#*"
- _, x- `% A/ hsend "df -Th\r"
" G5 h/ L1 q* Xsend "exit\r"- ]' q7 \, |+ K9 @
expect eof

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:06:25 | 显示全部楼层
shell调用expect执行多行命令.
% d3 w" p. |$ G) `9 r& m) G8 }" c9 ]& y& D, H2 r1 Y0 }
复制代码. O, n) X! s( p9 I
#!/bin/bash 6 P: Q0 m+ y4 H5 t" n, w
ip=$1  
" m" }( N/ j' U+ b+ K# u3 e. guser=$2 % K0 w. z5 L' _) O: ^0 e8 C
password=$3 / E# |3 w" e* X, C
( [- I3 w9 K+ {1 s
expect <<EOF  
' M( Q9 \* b# E- L$ _    set timeout 10
  m+ S, R1 T* i$ n    spawn ssh $user@$ip
# m, _1 L% S. T' s" M0 x    expect {
1 I" m6 q" m* V/ Q5 L8 K0 v        "yes/no" { send "yes\n";exp_continue } + c$ d2 ~9 \/ i! H! s
        "password" { send "$password\n" }
9 _, R  W, \% Z0 k' S    }
+ C/ y: T) Q) S& W* o. z    expect "]#" { send "useradd hehe\n" } " [0 i. v, y% t$ U% L3 O+ k, G5 t
    expect "]#" { send "touch /tmp/test.txt\n" }
( W; f+ L. S9 Z) w: f: y( t! n    expect "]#" { send "exit\n" } expect eof 9 E; I/ J, y7 q8 D# G6 N
EOF  
6 A8 Z6 p; J7 y: A #./ssh5.sh 192.168.1.10 root 123456

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:07:11 | 显示全部楼层
使用普通用户登录远程主机,并通过sudo到root权限,通过for循环批量在远程主机执行命令., A+ U2 t5 N1 V: T# ^9 {

% O& ]/ r9 L3 h0 u% h5 v复制代码
6 V0 B6 x8 `# _1 L, l! e: d8 ^! n$ cat timeout_login.txt
! v- {/ b3 w% _' U10.0.1.8$ \3 u# y- b7 R* _. V- O
10.0.1.34
  ?4 e" z# V/ t8 V10.0.1.88
  {. I7 c$ p0 o6 w* C10.0.1.76
) r" G( u8 z6 `# s+ C5 @10.0.1.2( ?5 |! j2 z- d) n, t
10.0.1.3
) r# @" z2 h0 ]! [2 x复制代码
: n- B* H' H' {& P$ ~复制代码3 L8 w8 p% G( {5 G/ H" W1 M# H
#!/bin/bash
* g$ e8 U/ u# X' b" z/ S" l& `" x. q( H
for i in `cat /home/admin/timeout_login.txt`
2 c8 \+ d4 S2 _do6 M5 Y) K" r5 W
- p% Q) i) r; F& `* K# ^
    /usr/bin/expect << EOF
7 r8 S- O: U9 i3 v7 r& B3 {& z" B    spawn /usr/bin/ssh -t -p 22022 admin@$i "sudo su -"8 `( X8 C6 B# a
1 x3 t3 M9 G; M  o3 V4 F* {
    expect {
% h- G% s3 O' g. i7 A        "yes/no" { send "yes\r" }: x  h& h: g! p! W" S( ]  c. K% ]. W5 d
    }   1 f0 e$ Q" I" X7 B2 @8 M

0 b1 L; w+ s8 g    expect {
8 Q+ E$ p0 ~& L* C. }+ j        "password:" { send "xxo1#qaz\r" }
/ k1 |% A  x- M7 }    }
& n- Y( f) C" o! B1 c    ) h3 Z  g. n& I$ ~1 Z
    expect {
+ e" @3 F0 U; c! h4 e( _        "*password*:" { send "xx1#qaz\r" }
9 l/ ^% _; A7 L( o; \    }8 {2 |) Z5 f( ]' E9 q

% t' |, G  o* H, H/ E+ M    expect "*]#"6 X  G1 m7 e# O/ l  n/ Y
    send "df -Th\r"% ?( l0 X5 p; v4 \: h
    expect "*]#"
% r0 |; P; ~  `) ]) c9 f7 z    send "exit\r"$ ]+ w; y& `, J# K( J
    expect eof
8 `& V$ z8 B' |: @+ s$ m5 ~0 h- `, q4 f2 n" B
EOF$ ^7 d8 L/ p' j( G+ a6 g& e2 I
done7 d. w# g- F$ `% i0 i
复制代码7 h4 v* f" e, O7 d  s
密码过期需要批量修改密码, w$ I" K+ i6 S5 F9 O8 k9 B

, k3 ]8 h( p% p/ t5 y/ W1 s- Y$ ]复制代码  z. `2 V3 V  e2 W0 u
#!/bin/bash+ z9 w; |& }" ?' O2 |( p3 h/ Z/ Z

' W9 @$ N% i3 s, |# M7 d" w3 Kfor i in `cat /root/soft/ip.txt`
+ F/ Z& I" g5 O( E- gdo
( z' z+ Y6 x5 u: C( ~* r
7 p: t/ y$ G7 |7 E6 L    /usr/bin/expect << EOF
. p4 R5 B9 f' r    spawn /usr/bin/ssh root@$i
( O- X$ r7 T6 k9 n
# S6 Q3 o! T4 ~2 h$ J+ Q( Y" b/ g    expect {
; @. e$ W0 m+ m, r+ Z        "UNIX password" { send "Huawei@123\r" }
" t" c) F1 J) h    }/ G# ^, f% O/ }% A! J
   
9 B( d9 M0 J! e: [3 X! R3 g' N    expect {7 `/ n" `% w# Z. j
        "New password:" { send "xxHuzzawexxi@1234#\r" }/ i3 k1 C7 x: X* c3 p1 Q) A
    }9 c" Z! a! a# q& l

5 `8 g, _+ ~- `7 r) ]   expect {
, o) v2 _3 f! _1 W+ Q        "Retype new password:" { send "xxHuzzawexxi@1234#\r" }1 [' v( _' g  |+ |
    }1 y2 ^+ A. j7 h1 F- {

+ S9 w& [5 \& E/ n9 }( Q1 V, N    expect "*]#"
+ v$ ~0 R3 {3 y+ Z9 G    send "echo Huawei@123|passwd --stdin root\r"9 a1 S$ [1 Y* e6 M
    expect "*]#"
1 c; ^# K. J+ O0 W8 a    send "exit\r"
6 t! E! w1 m% S2 F9 P0 y    expect eof
' G6 r+ B  X9 @- h% qEOF3 P; R5 w- S8 T; |
done

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:07:56 | 显示全部楼层
创建ssh key,将id_rsa和id_rsa.pub文件分发到各台主机上面。
; |, g) S5 G$ m8 h# _8 Q1 {
+ z$ D9 h. t" L$ v% |复制代码
! E3 F6 u6 s3 I: Z( }1.创建主机配置文件' Z3 W' W! Q: b  ]* `& c+ t
2 b2 A( {* Q. X  K
[root@localhost script]# cat host 9 B% y: M$ T5 U
192.168.1.10 root 1234566 F4 f# o' @# z2 \
192.168.1.20 root 123456
5 v, n6 E8 k# [8 @8 A192.168.1.30 root 123456
  @; C9 l9 X9 E, ^. g  o+ s: s9 @# D
[root@localhost script]# ls
" X9 I3 m' |, m; \7 V) o! m" Acopykey.sh  hosts
7 N3 u3 t8 L0 v, Y, F2.编写copykey.sh脚本,自动生成密钥并分发key.
; @4 J8 u" d5 J" j% k& J9 y( o[root@localhost script]# vim copykey.sh
: {; `9 g% t3 D# o/ s5 F6 b2 m2 O* y$ b. b$ v
#!/bin/bash7 B5 [0 J5 a. @. Q0 U1 W

, S- I9 q( |& h; ]; v/ T  I# 判断id_rsa密钥文件是否存在1 @2 W% }$ {, y: w0 U7 J- s9 D( N
if [ ! -f ~/.ssh/id_rsa ];then" ?( l2 e  y+ H4 P( n' Z! N/ T
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
& C  D4 H  ]4 a3 eelse
! U/ Y" X, }& s6 [ echo "id_rsa has created ..."; W' {/ K8 i5 Q* q6 V" v! _
fi% s* u& C2 d/ ~3 |9 X( }

0 l8 ]; |* X+ v; K8 Q4 _, ^#分发到各个节点,这里分发到host文件中的主机中.0 E; A" Z8 M  C4 o
while read line
. f; V/ h. E8 y' R9 o& t+ T  do
' u& T1 _* V4 W6 M* t4 `    user=`echo $line | cut -d " " -f 2`
0 {* K7 @* A' t" T$ x    ip=`echo $line | cut -d " " -f 1`0 w! H2 T" {4 W9 v# }9 Z3 h* J
    passwd=`echo $line | cut -d " " -f 3`) G. c) @- ?1 l1 T: ?- m& f, B, z; D, T
    1 ^% v. c* x8 c' R: l* R6 W
    expect <<EOF1 R+ F5 V( T- [& o$ E8 |
      set timeout 105 I/ ~  U6 L% ~$ a) Q6 V9 {; O8 n3 s
      spawn ssh-copy-id $user@$ip
) k, x: G, R0 d1 r3 L& h- f8 o2 i      expect {
% [% q; G& s2 t7 ]( n- |' O5 V        "yes/no" { send "yes\n";exp_continue }
( L5 `/ ]9 d6 }6 j* v. R! ~        "password" { send "$passwd\n" }6 C5 z$ O* J/ W1 E, b
      }# _) L9 A2 H& ]7 l; L5 w( m
     expect "password" { send "$passwd\n" }1 h$ O0 e2 g0 O" [5 ~& o- G
EOF
+ Y4 O- ^; s& D: q* c  done <  hosts

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:08:14 | 显示全部楼层
expect常用命令总结:7 J8 V, ^) n2 ^& c9 T

5 y' w5 g5 {9 V复制代码
  N- n6 c/ g. Cspawn               交互程序开始后面跟命令或者指定程序
8 R1 D2 T8 u1 B# B. i/ nexpect              获取匹配信息匹配成功则执行expect后面的程序动作+ \8 W# g9 L5 e; d* U7 K6 L
send exp_send       用于发送指定的字符串信息
; d' R$ K6 v  B' C$ R) O- Bexp_continue        在expect中多次匹配就需要用到  v# C: m) Y. \- z% k
send_user           用来打印输出 相当于shell中的echo
# J6 y; r7 c. `* D+ Xexit                退出expect脚本
( V- @0 p: e) F7 o4 S5 _" K' G  `' jeof                 expect执行结束 退出
* m2 u& ]9 A) L- a6 Sset                 定义变量
" A( P& o# T7 Pputs                输出变量, J+ d& z8 _* w3 D
set timeout         设置超时时间0 K3 q; u. n" S. ?0 ^0 d, w

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-11-5 12:08:54 | 显示全部楼层
示例:' w" J, v! e* H8 b, Y# a

( |2 B) g  v( j: F4 {& o1.ssh登录远程主机执行命令,执行方法 expect 1.sh 或者 ./1.sh1 }* ?: H! Z  a$ S
$ A# n6 J* J# m
# vim 1.sh . i1 u( S% u  l' v- t5 p: I! S
7 ^7 ^; f, y5 f  H1 v) y
#!/usr/bin/expect) E4 l1 ]! ?5 h( {+ N) D
; k: j' u$ D: u/ P
spawn ssh saneri@192.168.56.103 df -Th- W& ^& G/ `: B
expect "*password", T3 Z9 j3 W* D9 H" ?7 J+ U8 o  B
send "123456\n". l: ^2 d* x2 Z+ w
expect eof) v4 T/ u0 Z% M" m5 W  p1 m
2. ssh远程登录主机执行命令,在shell脚本中执行expect命令,执行方法sh 2.sh、bash 2.sh 或./2.sh都可以执行.& ]6 e9 q# [+ P& _4 V) R+ }1 G

* [, h1 i6 ^) t8 O: U9 i复制代码
9 D7 p9 |. F5 p  ~/ s0 C3 D#!/bin/bash
1 ^1 @2 T7 }& v& K" p+ ?" o# `" R% v9 Z% M
passwd='123456'
1 u( s# W& X3 }9 j! ~! X
' ]  K) J" N3 n( P$ C/usr/bin/expect <<-EOF6 L. W  z; P' n4 Q& Z( H5 G
1 _8 Y  ^+ _$ R/ W% _% U1 ]
set time 30; x- b6 i4 Z5 y3 A0 r
spawn ssh saneri@192.168.56.103 df -Th
+ {2 u! Z# n0 V+ O" ^: rexpect {3 ?) o$ O6 I3 {) Q' }" E# ]4 n
"*yes/no" { send "yes\r"; exp_continue }7 ?6 b. o6 h( w  _3 {$ Q
"*password:" { send "$passwd\r" }4 H. l& k! @( e& [: g* s8 J
}
* V+ U8 a& M4 x+ ?: Pexpect eof3 [2 o6 G$ h" c) T$ O* e
EOF
* b9 g" G9 s0 p/ i0 R1 \复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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