expect实现Linux自动登陆远程机器脚本实例

发布时间:2023-06-13

  

宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

  expect是由Don Libes基于Tcl(Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等交互过程,写到Shell脚本里以实现一些自动化操作。

  在 Linux 下进行远程登陆的时候,总是要进行 ssh 输入账号密码,相对比较繁琐。

  而有时候为了保护线上重要的机器不能随便登录,通常使用从本地登陆到公司的中间机器(跳板机)然后才能登陆到线上的机器。如果 A -> B -> C 三台机器,如果想从 A 直接到 C 只能通过 B 进行登录。下面的脚本就是解决这种有多个依赖的关系。

  注意事项:

  1. 使用实时 bash version >= 4.0,因为配置中需要使用关联数据

  2. 如果需要全局使用直接修改 autologin 的名字,移动到 PATH 路径下即可 eg: mv autologin /usrl/local/bin/to(改为自己想要使用的名字)

  脚本代码:

  

  

?

  

1

  

2

  

3

  

4

  

5

  

6

  

7

  

8

  

9

  

10

  

11

  

12

  

13

  

14

  

15

  

16

  

17

  

18

  

19

  

20

  

21

  

22

  

23

  

24

  

25

  

26

  

27

  

28

  

29

  

30

  

31

  

32

  

33

  

34

  

35

  

36

  

37

  

38

  

39

  

40

  

41

  

42

  

43

  

44

  

45

  

46

  

47

  

48

  

49

  

50

  

51

  

52

  

53

  

54

  

55

  

56

  

57

  

58

  

59

  

60

  

61

  

62

  

63

  

64

  

65

  

66

  

67

  

68

  

69

  

70

  

71

  

72

  

73

  

74

  

75

  

76

  

77

  

78

  

79

  

80

  

81

  

82

  

83

  

84

  

85

  

86

  

87

  

88

  

89

  

90

  

91

  

92

  

93

  

94

  

#!/usr/local/bin/bash

  

# @Version 0.3.1

  

# @filename to

  

# 修复等不需要要配置跳板机的时候执行命令,在配置跳板机位置默认填 no 即可

  

# @Author pemakoa@gmail.com

  

# Bash version >= 4.0 使用关联数组

  

  

# Usage: host user passwd port jump_host command

  

# 四种情况如下:

  

# 1. 直接登录目标机器 如 A

  

# 2. 需要中间机器登陆到目标机器 如 C, 其中 B 为中间机器,会先登录 B在从 B登陆到 C然后执行 command

  

# 3. 直接登录目标机器并执行相应的命令 如 D

  

  

declare-A _server_config

  

  

_server_config[A]=a_host a_user a_passwd a_port

  

_server_config[B]=b_host b_user b_passwd b_port

  

_server_config[C]=c_host c_user c_passwd c_port B (command eg) ls .

  

_server_config[D]=d_host d_user d_passwd d_port no cd /home ll

  

  

_config_keys=(${!_server_config[@]})

  

_length=${#_server_config[@]}

  

_login_server=$1

  

_config_status=false

  

  

# 是否输入登陆机器

  

if[ $_login_server== ];then

  

echo-e \033[40m\033[31m Please input login server, you can choose one follows list \033[0m

  

fori in${_config_keys[@]};do

  

echo-e \033[41;37m $i \033[0m

  

done

  

exit

  

fi

  

  

# 检查登陆的机器是否配置

  

fori in${_config_keys[@]};do

  

if[ $_login_server== $i];then

  

_config_status=true

  

fi

  

done

  

  

if[ ${_config_status}== false];then

  

echo-ne\033[40m\033[31m

  

Not config server info ...

  

Please config in_server_config like

  

Host User Passwd Port Jump Command\033[0m

  

exit

  

fi

  

  

# 登陆 如果配置跳板机,先登陆跳板机在登陆到目标机器

  

_host=$(echo${_server_config[${_login_server}]} awk{print $1})

  

_user=$(echo${_server_config[${_login_server}]} awk{print $2})

  

_passwd=$(echo${_server_config[${_login_server}]} awk{print $3})

  

_port=$(echo${_server_config[${_login_server}]} awk{print $4})

  

_jump=$(echo${_server_config[${_login_server}]} awk{print $5})

  

_command=$(echo${_server_config[${_login_server}]} awk-F{print $2})

  

  

if[ ${_command}!= ]; then

  

_command=expect \*]*\

  

send \${_command}\r\

  

fi

  

  

if[ ${_jump}!= ] [ ${_jump}!= no]; then

  

_jump_host=$(echo${_server_config[${_jump}]} awk{print $1})

  

_jump_user=$(echo${_server_config[${_jump}]} awk{print $2})

  

_jump_passwd=$(echo${_server_config[${_jump}]} awk{print $3})

  

_jump_port=$(echo${_server_config[${_jump}]} awk{print $4})

  

  

expect -c

  

settimeout 30

  

spawn ssh-p${_jump_port} ${_jump_user}@${_jump_host}

  

expect {

  

\yes/no\ { send \yes\r\; exp_continue }

  

\assword\ { send \${_jump_passwd}\r\ }

  

}

  

  

expect \*]*\

  

send \ssh-p${_port} ${_user}@${_host}\r\

  

expect \assword:\

  

send \${_passwd}\r\

  

${_command}

  

interact

  

else

  

expect -c

  

settimeout 30

  

spawn ssh-p${_port} ${_user}@${_host}

  

expect {

  

\yes/no\ {send \yes\r\; exp_continue }

  

\*assword:\ { send \$_passwd\r\ }

  

}

  

${_command}

  

interact

  

  

fi

  

  

  到此这篇关于expect实现Linux自动登陆远程机器脚本实例的文章就介绍到这了,更多相关Linux自动登陆脚本内容请搜索陆零网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持陆零网络!

注册即送1000元现金券