易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 3415|回复: 6
收起左侧

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

[复制链接]
发表于 2020-6-21 17:00:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
TRANSFER_HOST=111.111.111.111
4 B. A6 D6 }. `5 F5 mTRANSFER_SSH_PORT=2233
) S  x: R9 r, Y' M' {TRANSFER_USER=my_admin
! m( ?  [/ U1 y( f. D/ t3 [TRANSFER_PASSWORD=mypassword6 r7 {. ~; B1 L4 H
TRANSFER_PROJECT=/home/my_admin/deploy/transfer/*
! k2 r& m( |9 P3 X; \DEPLOY_DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
  N: o  a; q: R8 r: }) Ufuction remote_transfer(){
% ~4 E' L7 O( p3 k! H    echo "$1"
7 O- W; A8 S) ?    shift 1
/ E" N; o& r" L: i1 B. v9 m) b    expect << EOF
& j1 d+ f( n9 \& A        set timeout 30/ l: h% i9 s" r5 J/ ?
        spawn $@
$ o+ C  S! Z$ `$ L, c0 Y5 x; U        expect {
3 Y$ r2 H+ B6 _  ^8 ^            "(yes/no)" {send "yes\r"; exp_continue}
8 [- x5 K4 p9 q: e' b- W            "password:" {send "`echo $TRANSFER_PASSWORD |base64 -d`\r"}* A) V" S2 @' ]' W0 b9 K
        }
; ~7 E) \* |3 x# y3 k- Y" c7 J        expect eof
) l; u; M0 [9 ?% _. G7 oEOF* L9 P8 c- Y* A9 s& P; E
}" A" _: O, i% U$ y, ]
remote_transfer "Download files from remote JumpServer now ......" "scp -P ${TRANSFER_SSH_PORT}  ${TRANSFER_USER}@${TRANSFER_HOST}:${TRANSFER_PROJECT} ${DEPLOY_DIR}"+ E0 m8 k; G9 D. R3 N
0 H3 h8 z9 h/ H' \) e
 楼主| 发表于 2020-11-5 12:05:46 | 显示全部楼层
expect执行多条命令3 j3 Z( c7 ?8 K4 B, Z

% K9 p0 p% ]+ R, P3 U. u, J* m. g复制代码5 h; m( ~' t0 b' ^- I% ]3 g4 V& J
#!/usr/bin/expect -f' Z4 W* ?5 N# }# j
: z. L8 Z/ {/ m
set timeout 10
- |2 E5 t" M' U0 {: D0 ^% A  B( b' N& S: M* |. V; _0 @" D
spawn sudo su - root
4 y4 a5 T1 q# P% O/ Y$ p6 B7 ^, {expect "*password*"
* G3 R  A* |5 Xsend "123456\r"
7 u* r( \, k$ C* M+ g. sexpect "#*"  a5 Y  U- u2 m2 R, p
send "ls\r"
/ K  V( S' Q8 C$ S7 R; W+ ^$ a- p+ {# bexpect "#*"
, K) N7 n  H) Jsend "df -Th\r"
( J: L% y- X$ _$ \" u: Gsend "exit\r". w0 W: E, ]+ k. I5 X
expect eof
 楼主| 发表于 2020-11-5 12:06:25 | 显示全部楼层
shell调用expect执行多行命令.
' ^* i& S$ _# a( b4 E
" W" H+ U3 o9 ^( J4 j. N. f复制代码+ }+ l! U7 N; v
#!/bin/bash ; i6 s: R$ o' o0 O  D( C! ~
ip=$1  
, F- T5 J% z" t+ [+ ^7 o1 I0 }user=$2 3 z/ p  j) X+ ~) J4 F
password=$3
. E" T& J" z' M" m4 U  |
* Z& I" I7 c" z3 nexpect <<EOF  2 I5 c  B; Z3 z
    set timeout 10 " B3 x: t$ I! z- X
    spawn ssh $user@$ip
5 @# [4 A5 I7 G0 a" V    expect {
" y3 H* q, d, X* W) I0 R% u        "yes/no" { send "yes\n";exp_continue }
5 G% U+ u4 M; z3 P+ x        "password" { send "$password\n" }2 D2 Y7 ?7 L' F) d- R
    } 5 R+ C/ D$ d! ?- J8 Y( p
    expect "]#" { send "useradd hehe\n" }
; E2 B/ v. z; d0 J" `# z    expect "]#" { send "touch /tmp/test.txt\n" }
  u/ v- Z4 T8 m" I& b2 ~    expect "]#" { send "exit\n" } expect eof . h: N% o; d9 q& P) i! V/ E
EOF  
( n. I( F; I! L% S0 b% q; P3 x #./ssh5.sh 192.168.1.10 root 123456
 楼主| 发表于 2020-11-5 12:07:11 | 显示全部楼层
使用普通用户登录远程主机,并通过sudo到root权限,通过for循环批量在远程主机执行命令.6 R4 W3 q3 s' P" K8 B

7 O( B2 e& e, c7 |5 M复制代码1 G0 w0 J  o1 k/ Z+ K' V
$ cat timeout_login.txt
; k& u1 o; ^' O5 J3 T) f3 b10.0.1.8
6 v5 @& Y* b* b3 i* e! K  h! L- `# ^- f10.0.1.34& E9 u8 w+ e3 I! c4 P
10.0.1.88
* t. W" r5 n1 J2 p+ r; J10.0.1.76
. u' {* k" c4 {8 @3 Y10.0.1.2
; P. v! b( X. o) V/ k$ [  L& U10.0.1.3
! b8 y. Y( H9 Y! g- H. I" a复制代码
9 x) n- J4 U$ e  H! @' E复制代码
; O4 o( K* J& B8 S1 S#!/bin/bash
( d6 c9 @0 ]: L- y7 h
( S9 d( w. I" S: \+ v1 \( vfor i in `cat /home/admin/timeout_login.txt`
$ G- s: {& D) j0 V& J2 z/ g$ _. odo
$ I, b' ~, e, O: E' [% e: _1 j  N0 e" g+ l& E7 M6 x# z% Q. C8 p. J
    /usr/bin/expect << EOF4 L8 \9 t" c' |9 W+ q
    spawn /usr/bin/ssh -t -p 22022 admin@$i "sudo su -"% q: z2 c* W2 \# x5 p5 @# j
' U" J" ~4 k' y  {8 E
    expect {
. X. q; V9 r- b, z; g% z) z2 s. G. r        "yes/no" { send "yes\r" }- Q" a  |/ L8 K
    }   : {. [2 O; ~) o) a
0 @. V! A* C5 T& ~0 h% X7 A
    expect {
! E" E$ ~4 B+ v; D1 r        "password:" { send "xxo1#qaz\r" }, Z7 v6 U2 Q1 u: ~' m' v. M) S8 ]
    }( h3 c: a& R+ ?' n/ t! y- S6 D
   
6 e" q1 S  z) m3 N5 ~5 }: S    expect {% K6 k3 I, y5 {: F
        "*password*:" { send "xx1#qaz\r" }8 F3 Q; E7 Q- f. u4 f$ u
    }& B4 r- N; `6 {# R' P8 T

9 X) ^$ s6 X9 }# q    expect "*]#"
2 q- M; L  R4 R9 c" b6 I1 \    send "df -Th\r"
4 N9 @$ Z% K+ `' ]    expect "*]#"! M% q# [8 W9 x
    send "exit\r"+ F9 h# |3 @5 d3 V0 b# N7 y" h
    expect eof3 V, f0 ]* e' \) P
2 c7 [9 H( K. }9 A  E4 |6 D7 w4 p. e! z0 @
EOF! j3 o* D! u0 \9 ^. C1 X
done! B6 A  V) ]7 Z  u
复制代码/ X0 i. v5 S" T. A
密码过期需要批量修改密码
1 g5 A- y, B$ L, ]0 l# |' q1 Q' g5 Y: D. U
复制代码( E! l% Q  s2 x6 j
#!/bin/bash
  `8 d: i" F/ J/ v% J& S! L3 S2 B1 Q5 S9 d6 n9 E
for i in `cat /root/soft/ip.txt`
1 W% Z6 q$ n( |0 k* ~+ Ddo; T- Q' S! _% }/ p" X2 R* X4 Y/ ^

* X$ n% T# K  |5 `- P, N    /usr/bin/expect << EOF% [+ Y0 t7 \) B( ^9 n+ s/ K, m
    spawn /usr/bin/ssh root@$i
/ f1 Q( H+ j  v/ j
' ?. Y5 N, ~( B  W. z    expect {
/ x. {9 S+ H0 V6 S        "UNIX password" { send "Huawei@123\r" }: N6 V8 r; _. T3 ?. D
    }# n  m9 `: H$ k
   
* r3 T; o2 {7 N' O/ a/ u" W1 E( e    expect {
4 X9 g7 _! `& F- k7 B1 ?6 D+ C        "New password:" { send "xxHuzzawexxi@1234#\r" }" H% y( U- C3 d
    }
7 ^3 d& F; d" G) y2 Z0 g, l
& q1 A" t4 {' y2 @   expect {. ^( ]6 c6 k/ W# e1 F- _5 W
        "Retype new password:" { send "xxHuzzawexxi@1234#\r" }( S+ I2 y- f5 P0 v* p% D
    }3 s2 W+ |2 ?- S2 f) L  \

8 @4 \# q2 ^; C, C( S    expect "*]#"9 \+ L- x7 a: M: \2 f
    send "echo Huawei@123|passwd --stdin root\r"
) ~0 M# G% q# D+ ^    expect "*]#"; T0 Q" p- e2 i" |/ _
    send "exit\r"
7 _. b, @# {4 w' p( ~* q+ P    expect eof
+ c+ @% X3 u! o) R- ZEOF
: r9 R: o# Q' L/ a3 z5 |" Adone
 楼主| 发表于 2020-11-5 12:07:56 | 显示全部楼层
创建ssh key,将id_rsa和id_rsa.pub文件分发到各台主机上面。$ c& r# [7 F8 b+ F5 Z& A
, H* J7 l) y( D* f9 Y/ H5 O& Y
复制代码
& l; G( Z4 I; X+ c( d1.创建主机配置文件3 k/ J) M) G& _
$ ]. J/ Z8 ]0 y) v2 j7 _
[root@localhost script]# cat host   F  F+ X& w8 S
192.168.1.10 root 1234564 |1 L" W8 p  m5 \: o; j9 a. }6 R
192.168.1.20 root 123456& j  s7 n- F! Z4 D& k
192.168.1.30 root 123456
, L8 F# m3 P" U9 L2 Z6 S) d8 C' a3 L9 U% M& a1 p4 z
[root@localhost script]# ls2 x' E8 {& P* u3 l
copykey.sh  hosts6 e' u, l! d8 F$ h. k
2.编写copykey.sh脚本,自动生成密钥并分发key.; H' a+ K, O& Y4 p5 k& m
[root@localhost script]# vim copykey.sh
( {+ o3 h1 v5 _6 s& B& v. n! `2 P0 Q4 {
#!/bin/bash% i/ e4 p( W; i1 x  c
7 k1 j5 n) g6 T# L) m
# 判断id_rsa密钥文件是否存在
/ {6 L" q9 @) v, {3 Dif [ ! -f ~/.ssh/id_rsa ];then, m4 [( L6 h. H- C8 H5 |3 J
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
: r, [+ {6 M' d, Melse; |4 P  ]) y, J' m% C
echo "id_rsa has created ..."
6 N* K$ ?: o0 D1 g' Ifi$ ~1 P, ^( K. N; r5 U" u7 G% G
4 U* z, z1 V) V+ W& |
#分发到各个节点,这里分发到host文件中的主机中.
- u1 n' m0 v, X8 cwhile read line% n8 E1 c2 o8 ?; r- {( g1 G
  do* @: P! g/ _/ p& u: w
    user=`echo $line | cut -d " " -f 2`
6 r! f# K, s1 u" S* T    ip=`echo $line | cut -d " " -f 1`
6 Z! t" b+ z( R8 P1 I) k    passwd=`echo $line | cut -d " " -f 3`
  }2 A- O: W) _+ Y   
, N9 Z! H: w: }    expect <<EOF$ V9 L" V* J' B" M, \
      set timeout 10) o( _/ T8 v2 h! N' w
      spawn ssh-copy-id $user@$ip
" ~- W: s( t; i  K1 \8 E      expect {: u2 }  x9 X1 o# K
        "yes/no" { send "yes\n";exp_continue }
1 @- d$ Y  I0 j: j5 k+ k        "password" { send "$passwd\n" }# I0 S0 [, p; D+ N: ]8 [
      }( N8 G9 U' Z4 ?, n9 [% @
     expect "password" { send "$passwd\n" }
% n# ^; S2 Q# n% H- J. e& C" [) nEOF
7 o, g- K* M/ L( `- t1 \' T  done <  hosts
 楼主| 发表于 2020-11-5 12:08:14 | 显示全部楼层
expect常用命令总结:
" M  H7 b/ s9 y, N* S+ d5 x, Q* u+ l3 f  b' U2 ]4 L
复制代码
5 j4 X( Z" U& t7 M* R) P- b% M# vspawn               交互程序开始后面跟命令或者指定程序
" K0 @1 k  N" c# Cexpect              获取匹配信息匹配成功则执行expect后面的程序动作
2 g: g0 p: q* V  c/ j' A& Osend exp_send       用于发送指定的字符串信息
& O1 P9 }4 S+ |exp_continue        在expect中多次匹配就需要用到0 n: `' g6 q! W) Y: A* T( d
send_user           用来打印输出 相当于shell中的echo+ f$ |( h# [! c* N3 p
exit                退出expect脚本" K: `4 R' Y7 t3 z, T$ z* h3 u1 w2 e5 d
eof                 expect执行结束 退出# s2 Q& U. \+ x
set                 定义变量5 t/ y  t' H4 j6 l" C0 g$ K7 T
puts                输出变量
2 q' V* s7 i+ X% l1 {8 m; u* n3 nset timeout         设置超时时间" V3 b% v. T) j! |3 I
 楼主| 发表于 2020-11-5 12:08:54 | 显示全部楼层
示例:
0 p* {4 d9 j% Y8 L3 A6 m1 M
5 a, ]% s) _( J9 g: A' z  @1.ssh登录远程主机执行命令,执行方法 expect 1.sh 或者 ./1.sh
6 J6 F# W% s  b8 T/ m
) n1 V& j, i, s6 }8 u! Q# vim 1.sh
1 _: {' r4 x3 t" ~0 Z1 ]* Z  @$ g4 @( Y2 j4 d
#!/usr/bin/expect1 g  G) S% t0 g
# B; F# ^( j% ?3 ], o/ l
spawn ssh saneri@192.168.56.103 df -Th" \( k8 a* F7 s' ]
expect "*password"
( J2 L9 F' p6 M/ Y& ^+ v* a% @send "123456\n"; E, s; ?* S4 X7 |7 U) W/ ]
expect eof  X( i7 B% l9 Z+ m2 i5 O
2. ssh远程登录主机执行命令,在shell脚本中执行expect命令,执行方法sh 2.sh、bash 2.sh 或./2.sh都可以执行.
' O" Z$ ?6 `6 ]" \
; c' A( q, v1 j复制代码7 N- |8 }5 a3 `7 y
#!/bin/bash
6 A5 Y+ j- e% {& b/ z& p$ Y! [# f6 B& }% o- t
passwd='123456'
/ [1 C5 g+ G6 Y4 E, |: @7 P; |. V% d
/usr/bin/expect <<-EOF' O. \) ?: N- M. j3 O

7 i2 ?5 h/ M+ L7 \7 U, I9 Cset time 30
: X% b. O1 k$ bspawn ssh saneri@192.168.56.103 df -Th5 x6 ~- g% [5 h4 q8 _, ~
expect {
# Z7 E) M+ q  D5 I"*yes/no" { send "yes\r"; exp_continue }* v) |: m  U( G+ I% p
"*password:" { send "$passwd\r" }1 Q2 u* Z7 K3 `, z. A# C
}$ ?0 b9 a; W/ H7 p4 C
expect eof
" a8 ~; Z! @* u4 BEOF, B: _9 v8 k' ]; I3 u6 c
复制代码
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:37 , Processed in 0.058527 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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