设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间09 现在时间09 缓存数据 我们所有的努力所有的奋斗,都是为了拥有一个美好的未来。和遇见更好的自己。请把努力当成一种习惯,而不是三分钟热度。每一个你羡慕的收获,都是努力用心拼来的。早安!

我们所有的努力所有的奋斗,都是为了拥有一个美好的未来。和遇见更好的自己。请把努力当成一种习惯,而不是三分钟热度。每一个你羡慕的收获,都是努力用心拼来的。早安!

查看: 1329|回复: 2

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:232
  • 打卡月天数:0
  • 打卡总奖励:4143
  • 最近打卡:2025-04-20 08:44:27
等级头衔

等級:晓枫资讯-上等兵

在线时间
4 小时

积分成就
威望
0
贡献
474
主题
442
精华
0
金钱
5571
积分
988
注册时间
2023-1-3
最后登录
2025-6-1

发表于 2023-7-27 09:54:23 | 显示全部楼层 |阅读模式
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. #!/usr/local/bin/bash
  2. # @Version 0.3.1
  3. # @filename to
  4. # 修复等不需要要配置跳板机的时候执行命令,在配置跳板机位置默认填 no 即可
  5. # @Author pemakoa@gmail.com
  6. # Bash version >= 4.0 使用关联数组

  7. # Usage: host user passwd port jump_host command
  8. # 四种情况如下:
  9. # 1. 直接登录目标机器 如 A
  10. # 2. 需要中间机器登陆到目标机器 如 C, 其中 B 为中间机器,会先登录 B在从 B登陆到 C然后执行 command
  11. # 3. 直接登录目标机器并执行相应的命令 如 D

  12. declare -A _server_config

  13. _server_config['A']="a_host a_user a_passwd a_port"
  14. _server_config['B']="b_host b_user b_passwd b_port"
  15. _server_config['C']="c_host c_user c_passwd c_port B '(command eg) ls .'"
  16. _server_config['D']="d_host d_user d_passwd d_port no 'cd /home && ll'"

  17. _config_keys=(${!_server_config[@]})
  18. _length=${#_server_config[@]}
  19. _login_server=$1
  20. _config_status=false

  21. # 是否输入登陆机器
  22. if [ "$_login_server" == "" ];then
  23.     echo -e "\033[40m\033[31m Please input login server, you can choose one follows list \033[0m"
  24.     for i in "${_config_keys[@]}";do
  25.         echo -e "\033[41;37m $i \033[0m "
  26.     done
  27.     exit
  28. fi

  29. # 检查登陆的机器是否配置
  30. for i in "${_config_keys[@]}";do
  31.     if [ "$_login_server" == "$i" ];then
  32.         _config_status=true
  33.     fi
  34. done

  35. if [ "${_config_status}" == "false" ];then
  36.     echo -ne "\033[40m\033[31m
  37.         Not config server info ...
  38.         Please config in _server_config like
  39.         Host User Passwd Port Jump Command\033[0m"
  40.     exit
  41. fi

  42. # 登陆 如果配置跳板机,先登陆跳板机在登陆到目标机器
  43. _host=$(echo ${_server_config["${_login_server}"]} | awk '{print $1}')
  44. _user=$(echo ${_server_config["${_login_server}"]} | awk '{print $2}')
  45. _passwd=$(echo ${_server_config["${_login_server}"]} | awk '{print $3}')
  46. _port=$(echo ${_server_config["${_login_server}"]} | awk '{print $4}')
  47. _jump=$(echo ${_server_config["${_login_server}"]} | awk '{print $5}')
  48. _command=$(echo ${_server_config["${_login_server}"]} | awk -F"'" '{print $2}')

  49. if [ "${_command}" != "" ]; then
  50.     _command="expect "*]*"
  51.     send "${_command}\r""
  52. fi

  53. if [ "${_jump}" != "" ] && [ "${_jump}" != "no" ]; then
  54.     _jump_host=$(echo ${_server_config["${_jump}"]} | awk '{print $1}')
  55.     _jump_user=$(echo ${_server_config["${_jump}"]} | awk '{print $2}')
  56.     _jump_passwd=$(echo ${_server_config["${_jump}"]} | awk '{print $3}')
  57.     _jump_port=$(echo ${_server_config["${_jump}"]} | awk '{print $4}')

  58.     expect -c "
  59.     set timeout 30
  60.     spawn ssh -p${_jump_port} ${_jump_user}@${_jump_host}
  61.     expect {
  62.         "yes/no" { send "yes\r"; exp_continue }
  63.         "assword" { send "${_jump_passwd}\r" }
  64.     }

  65.     expect "*]*"
  66.     send "ssh -p${_port} ${_user}@${_host}\r"
  67.     expect "assword:"
  68.     send "${_passwd}\r"
  69.     ${_command}
  70.     interact"
  71. else
  72.     expect -c "
  73.     set timeout 30
  74.     spawn ssh -p${_port} ${_user}@${_host}
  75.     expect {
  76.         "yes/no" {send "yes\r"; exp_continue }
  77.         "*assword:" { send "$_passwd\r" }
  78.     }
  79.     ${_command}
  80.     interact
  81.     "
  82. fi
复制代码
到此这篇关于expect实现Linux自动登陆远程机器脚本实例的文章就介绍到这了,更多相关Linux自动登陆脚本内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:29
  • 打卡月天数:0
  • 打卡总奖励:356
  • 最近打卡:2025-04-03 01:37:49
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
406
积分
64
注册时间
2023-1-20
最后登录
2025-4-3

发表于 2024-12-29 12:30:35 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2023-12-9
最后登录
2023-12-9

发表于 3 天前 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

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