易陆发现互联网技术论坛

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

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

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

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

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

x
TRANSFER_HOST=111.111.111.1116 Q% n1 p5 b6 K  j* w+ Q/ i9 _0 m
TRANSFER_SSH_PORT=2233
: _" `" X8 i! K7 h) V: |* NTRANSFER_USER=my_admin
, o; i2 m5 n* e) K- I6 D) ?7 DTRANSFER_PASSWORD=mypassword" a7 f; |' ?/ P* @4 x9 c4 y
TRANSFER_PROJECT=/home/my_admin/deploy/transfer/*  |4 [0 V% v/ |
DEPLOY_DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
3 m7 K, w( G# k3 C2 t  g) H- C- yfuction remote_transfer(){
' \; m8 Y8 Y( w    echo "$1"- u, }- a* S/ q+ A
    shift 1
4 `4 S; y6 E+ O' a0 Y4 {2 P# F    expect << EOF
% k1 i' H4 s: \, g3 x3 b' Z) T8 P  D        set timeout 30. ^/ n* D! L# x( C7 |; \
        spawn $@9 G0 w3 J$ p# G; x
        expect {
% K. b* [2 Q7 n            "(yes/no)" {send "yes\r"; exp_continue}1 q5 t  G; O; }
            "password:" {send "`echo $TRANSFER_PASSWORD |base64 -d`\r"}
1 ?; [" b% \7 B. ?+ J        }
* q% b# I3 a; Y: C        expect eof
1 ]- n* y- L2 C1 }EOF
* d- O# W# i( Q- b/ g}" Y* C$ Z6 x) @& `* h1 `
remote_transfer "Download files from remote JumpServer now ......" "scp -P ${TRANSFER_SSH_PORT}  ${TRANSFER_USER}@${TRANSFER_HOST}:${TRANSFER_PROJECT} ${DEPLOY_DIR}"
( Q0 I) H5 S3 K( f( N! ]& |: B8 o) D, B" j, Q
 楼主| 发表于 2020-11-5 12:05:46 | 显示全部楼层
expect执行多条命令
! t( Z/ }! h2 p( ?
, k6 G& E! r4 Q复制代码' Q' I1 c; D& C) Q; q1 H' }
#!/usr/bin/expect -f
; E4 ~; l2 \* o  C
# v, I$ d: y7 F: Q+ c! K+ J, C8 wset timeout 103 ~' `( A$ R; _" l' Z- x
: @1 w6 E5 t9 w* N" r
spawn sudo su - root: l$ }. |/ W9 |; B% E
expect "*password*"
6 C+ g3 [+ q# z4 T; ?6 N) X  vsend "123456\r"
8 N0 p7 G9 q- e: W, O5 y1 qexpect "#*"; x$ m2 v% j; g/ _
send "ls\r"
6 d$ O% i9 `. Uexpect "#*"
  a0 u+ O: A9 B) w, c, @  dsend "df -Th\r"
4 ~9 H4 Y4 w$ F! {" i* Rsend "exit\r"
$ @' L8 L& j* ?expect eof
 楼主| 发表于 2020-11-5 12:06:25 | 显示全部楼层
shell调用expect执行多行命令.
& ^6 }2 D' J4 ^9 Q) y) r
' n. I4 {# b5 P8 J  n# S复制代码# Y  l" M* q7 E) ]6 w
#!/bin/bash 7 c' B5 f) W2 I* w$ y
ip=$1  4 y" Y9 T, c9 b! Q( V6 ^
user=$2 / j/ L) W" i: n- {
password=$3 5 S! A8 F' A3 C/ Y% }+ |, q& O

0 b3 N% f2 ^- ]6 ?expect <<EOF  
& \. x/ `4 [* H* e8 N; K! w$ g0 P    set timeout 10
$ R% f2 X4 k; c! j# U) C    spawn ssh $user@$ip & T: Q2 D# m2 t
    expect { $ Z2 {& K7 q2 Q, `7 v5 N9 ^2 B
        "yes/no" { send "yes\n";exp_continue } 6 N% Q. [- W- I9 A7 C+ P" e2 K( B, @
        "password" { send "$password\n" }1 ]. a% n  o: e+ c& L1 x+ y
    }
7 ?. G- @8 J/ r, \2 G/ C& K1 P    expect "]#" { send "useradd hehe\n" } # X! z! W% u- m( u5 h% ]: S6 E2 g- R
    expect "]#" { send "touch /tmp/test.txt\n" } 8 V5 m. B5 p0 s. e* E
    expect "]#" { send "exit\n" } expect eof % f! m5 H: t) {3 W
EOF  ; G, ^+ L" f) y; e, {# r
#./ssh5.sh 192.168.1.10 root 123456
 楼主| 发表于 2020-11-5 12:07:11 | 显示全部楼层
使用普通用户登录远程主机,并通过sudo到root权限,通过for循环批量在远程主机执行命令.
1 c9 f1 |: G+ o5 y5 K
. [" E' Q8 I" w复制代码
. A& T2 ^: ^. @# k' c: u) d# G$ cat timeout_login.txt
9 c, ^% H: i. Q; o2 C' w# Z10.0.1.8( T2 ^8 ?+ A# T1 U( a
10.0.1.347 @2 w0 O, J5 X* L3 ]  U
10.0.1.88& I$ m1 [# q3 X# [
10.0.1.76
( n; l/ W' Q5 o10.0.1.20 \$ Y: Q8 o7 z8 I& u+ k
10.0.1.3
5 s8 o5 J; W+ u5 I复制代码
0 L( K7 E# ~  F; X( y复制代码5 _8 A7 `  j- P. k& N* @, g) ?
#!/bin/bash
9 c9 F/ d7 H$ L8 Z1 W, Y' v; G
& S( j9 L) g6 i! P) J$ e; ufor i in `cat /home/admin/timeout_login.txt`
9 l8 P0 \: e& ^5 X7 w( odo
& Z! |+ [% h5 ]1 ?4 r2 N3 [4 T2 T  G/ x* b
    /usr/bin/expect << EOF+ r3 {; ^: F% @8 o" j; L
    spawn /usr/bin/ssh -t -p 22022 admin@$i "sudo su -"4 ?7 [% w2 }8 i: T. A" ?% N$ Q

3 s, v" R1 D) J1 ?) H& V    expect {0 c' v. ]0 A  Q: w
        "yes/no" { send "yes\r" }7 G  U  |+ T4 ^# ^- `  Q
    }   
- R  Q- f  K& R6 y. u4 [3 C; T8 W9 e3 b0 M+ p
    expect {
7 l! G. V4 ^. B; I) {3 _        "password:" { send "xxo1#qaz\r" }
1 c( s0 \$ l( W# ]- f8 v. m5 @  q    }  ?% p# x& f' y2 h) W
    1 U8 y3 R; N+ B' P# D
    expect {
- h/ r( L2 V( V! q( k        "*password*:" { send "xx1#qaz\r" }
" S9 F; H- H5 H8 X+ l! m; M    }6 J  j" b' ]; u' B5 O
: \8 y! v( }7 s
    expect "*]#"
4 f- Z% |+ \/ @7 G5 v* y0 k$ }    send "df -Th\r"8 |6 ?$ |! D( C2 }
    expect "*]#"- ~3 g7 }8 F8 s* i& j, q% S1 D# V
    send "exit\r"& K5 q& y4 g- ]' v2 [6 H0 m, \
    expect eof8 {( W2 f  K7 I7 j- T' a' n$ Q
2 d! l9 v. J2 K: k2 R) b9 i9 G( _1 {) D
EOF
  J" K, D9 I8 I. Q, @3 Q$ cdone- m. S9 B1 j3 n9 }8 u$ Q
复制代码
; ~# u0 D! [/ K. S3 B- C& ? 密码过期需要批量修改密码) p, F0 a; {1 Q, M0 ]6 U
& E* N( A- M" r% f% F, ~/ a
复制代码
4 y/ R" x) `' g8 c#!/bin/bash1 Y3 k- o# Q- ~0 U( ?% z. M

9 O7 I( _0 E4 S7 sfor i in `cat /root/soft/ip.txt`
" K2 `% Q. }7 Kdo: u- M. W) _& K7 K- D/ z

/ U0 Q! c' \1 F) @3 w" d9 N    /usr/bin/expect << EOF
9 |$ [) a6 H* m/ \# J+ U( W    spawn /usr/bin/ssh root@$i
' N) }# E" v" m2 k, K" n# m5 B0 k: d* H& N1 b" Q# X
    expect {0 ^" g( ^! d" I4 \2 n* F" m
        "UNIX password" { send "Huawei@123\r" }; S# }7 l- ~  O+ J* w  N
    }
* C# `* ]; x8 M- x# J' v# C+ t3 D6 o   
! |! V$ E& H& u0 ]7 v/ k    expect {) F2 P! `  [& H: A- L
        "New password:" { send "xxHuzzawexxi@1234#\r" }
1 Q+ ]! q) w8 e! b0 p& y    }
7 w, n' a; |4 p- V' Z" v3 [
2 T9 @4 F: ?* i9 w   expect {4 ~- n9 F5 G' A) s  }9 k
        "Retype new password:" { send "xxHuzzawexxi@1234#\r" }
/ |2 w5 P) I  Z3 r3 y! Y    }
; r$ \. i! f# g0 s. o7 ~# l$ K: i7 K( O$ J& {
    expect "*]#"
# J. z0 `& @# W% k: E  t/ z    send "echo Huawei@123|passwd --stdin root\r"
4 N: ]) L/ Q4 y% U    expect "*]#"
8 `; P' X  V+ v1 \8 G! J, n    send "exit\r"
& @. B+ P; {; E! [3 n    expect eof6 i, z- k/ _. U  C$ C% I! R
EOF7 Q# R6 I0 j9 d  \8 \4 y  C
done
 楼主| 发表于 2020-11-5 12:07:56 | 显示全部楼层
创建ssh key,将id_rsa和id_rsa.pub文件分发到各台主机上面。1 M1 y  M  I  p
( ~, @0 e+ ^& L4 b! F+ K
复制代码
3 L$ G9 }% {" _' X' @1.创建主机配置文件
" K6 @' p+ p3 `% K% |9 r+ z5 L, G) y# J
[root@localhost script]# cat host 6 [) I* V5 ?1 o0 S7 c+ w1 f
192.168.1.10 root 123456/ N2 Q/ z- _2 ?# D, ]5 _9 n6 T, T( z
192.168.1.20 root 123456
0 [* t! }' Q7 W  L192.168.1.30 root 123456
1 `6 T. I7 @. ^1 G( z4 ~; ~7 R. A1 \2 j7 p
[root@localhost script]# ls
$ ^# v3 H' @; J( B3 }' k9 Pcopykey.sh  hosts
" q* ~+ v$ O5 r, u6 I- A2.编写copykey.sh脚本,自动生成密钥并分发key.% w& A7 s" \: x0 g) b# X0 Q. P/ a
[root@localhost script]# vim copykey.sh
0 @" \( `! n2 e4 B* i
- P( `' E2 ?4 n& k#!/bin/bash
$ {4 s/ b/ F% {( Q! W! m
3 m+ K( _1 ]9 ~  T( R$ W# 判断id_rsa密钥文件是否存在# R; w' V. B0 s6 b+ l. C
if [ ! -f ~/.ssh/id_rsa ];then3 B$ {4 i, K* V7 v' C4 h" x
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
7 Z) w+ Y" z8 n1 C6 nelse& G0 v$ M( y# [4 J" @( A
echo "id_rsa has created ..."
% |+ |( e2 h+ d  Z6 [% m" hfi
  w0 _' w) o2 x" T' f, w
7 o) M% n0 R: r, F#分发到各个节点,这里分发到host文件中的主机中.0 X# a, U. p) |3 X) {8 V& x2 x  H
while read line& j( [. K% c6 J6 b1 t
  do
4 ]% U0 Z. q3 ~) y6 ~    user=`echo $line | cut -d " " -f 2`
& p8 V- A! m; [; n1 }: _    ip=`echo $line | cut -d " " -f 1`
5 o5 N1 H* u  e4 p. U" \    passwd=`echo $line | cut -d " " -f 3`/ k9 w' \, @3 L7 I5 d. M
   
7 V7 Z% G* N/ E3 O, e  h3 d' _% x) I    expect <<EOF
. A$ [& D; ~$ c: f      set timeout 10
0 p! q; P; N" R" L$ G! b" R      spawn ssh-copy-id $user@$ip
  T. e7 q9 ^. W' X* [7 x( I8 a      expect {
6 i. n: H' T$ L; [2 k        "yes/no" { send "yes\n";exp_continue }
+ q, m6 P8 a& r        "password" { send "$passwd\n" }8 y7 [, Z/ L1 P) d. h/ X
      }3 V" ^  c% A% ?9 D
     expect "password" { send "$passwd\n" }
+ l: x: I2 E) W& A" R$ vEOF
6 p% ]$ G6 F: f6 n" \  done <  hosts
 楼主| 发表于 2020-11-5 12:08:14 | 显示全部楼层
expect常用命令总结:
' d2 c2 i) F# [- S! j! E
3 L" h: U; m3 t9 y  F; k2 O( |复制代码
6 H  y' K# }1 ^. ?. Xspawn               交互程序开始后面跟命令或者指定程序6 K6 U* P/ ~( K4 X) I7 v$ ^$ |; p8 x
expect              获取匹配信息匹配成功则执行expect后面的程序动作' O" q* e* v4 z# h
send exp_send       用于发送指定的字符串信息4 j: V9 n) {4 s7 F
exp_continue        在expect中多次匹配就需要用到
8 c% O* k* b- n/ S& m' ~9 O$ y7 G$ Ssend_user           用来打印输出 相当于shell中的echo" ~( d+ b) l# _# L& \! z$ |) V  t' G
exit                退出expect脚本
. J4 P$ g0 u5 Yeof                 expect执行结束 退出/ U  r, J6 X6 ~4 c7 @  n* j7 E8 I
set                 定义变量; k' K# n* a' ^4 e$ }0 R. T$ ]
puts                输出变量  _% d1 M+ y% @
set timeout         设置超时时间
4 K" \/ e. m# D$ K: z6 Y
 楼主| 发表于 2020-11-5 12:08:54 | 显示全部楼层
示例:
! q; v# t  h' i0 `! g
7 d! A( H$ c) }" p1.ssh登录远程主机执行命令,执行方法 expect 1.sh 或者 ./1.sh+ m/ K$ G6 E% h0 O) }/ E

1 u8 f- a0 c+ m& }# Y# vim 1.sh
7 l1 U/ c/ j7 n8 T: H9 E3 ^. u
#!/usr/bin/expect' S0 R' H9 R  j& T6 U  D! R

- H8 _# t' ^+ o# @! q5 T! j+ j* wspawn ssh saneri@192.168.56.103 df -Th: x1 @  K0 @8 \
expect "*password". X% L2 g$ F2 J/ \
send "123456\n"( W2 `+ D' B6 \; H/ l
expect eof! ~; U$ J* @5 v
2. ssh远程登录主机执行命令,在shell脚本中执行expect命令,执行方法sh 2.sh、bash 2.sh 或./2.sh都可以执行.! ]) V* J( Z& o, J. {9 j

  K/ ^3 d1 ?$ C: ~6 V0 J1 D. N复制代码! a$ X6 N( ?! t* Z
#!/bin/bash# l# K0 d+ m  o! j# Y! l* w

  m9 T; s2 p* p7 y% Rpasswd='123456'6 |. u! L3 `# D0 f7 ^) Z1 r

0 [  Q7 F2 W3 N+ ?" n/usr/bin/expect <<-EOF$ C  p. ~  a0 |) @+ l2 j8 G9 O
, M/ ^  N3 ^$ g# F  Z# C
set time 30
3 w) [3 `0 {  q3 ]spawn ssh saneri@192.168.56.103 df -Th. G7 V9 R7 U' o8 v8 s
expect {
1 h: \# D* Z, o3 W1 K; \3 u+ f- h1 B"*yes/no" { send "yes\r"; exp_continue }
) n0 D- W( X9 G% m2 J4 _"*password:" { send "$passwd\r" }- a' Y( K- F/ a: Y) M2 y* L9 q$ h
}" n8 U/ B$ F: p8 t7 K
expect eof
$ W' b3 i& Q! J7 }6 Q! dEOF
; j+ d- Q1 B5 @, F( Q6 J复制代码
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-8 23:59 , Processed in 0.052908 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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