在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言 公司开发使用docker,每次登陆自己开发机总要输入 前些天在同事进行技术分享时,看到他竟然只输入了一行命令./test.sh就成功登陆了开发机,甚是惊异,于是回来搜索研究了一下,遂成此文。 shell脚本基础 在编写ssh自动登陆脚本之前,先说一下shell脚本的基础,此基础不是一些语法什么的,网上到处都是,这里总结了一下shell脚本的运行机制~ shell脚本的运行方式 首先要说一下shell的几种启动方式,正是踩了脚本启动的坑,才使用原来十分钟就搞定的脚本,花了两个小时才搞定。同时也使得我们运行shell,知其所以然。 通过文件名执行 指定脚本解释器来执行文件 使用. ./file_name或source命令执行脚本 shebang 我们写一个shell脚本时,总是习惯在最前面加上一行 #!/binbash,它就是脚本的shebang,至于为什么叫这么个奇怪的名字,C语言和Unix的开发者丹尼斯·里奇称它为可能是类似于"hash-bang"的英国风描述性文字; 贴一段wiki上的解释:
简单的说,它指示了此脚本运行时的解释器,所以,使用文件名直接执行shell脚本时,必须带上shebang; 此外,我们还可以在shebang后面直接附加选项,执行时我们默认使用选项执行; 如 test.sh的shebang为 #!/bin/sh -x,那我们执行脚本时: ./test.sh hello 相当于: bin/sh -x ./test.sh hello; 而编写一个ssh自动登陆脚本,需要用到的shebang(解释器)为 /usr/bin/expect; 需要注意的是:在指定脚本解释器来执行脚本时,shebang会被指定的脚本解释器覆盖,即优先使用指定的脚本解释器来执行脚本(习惯性地用sh ./test.sh却提示command not found) expect解释器 expect是一个能实现自动和交互式任务的解释器,它也能解释常见的shell语法命令,其特色在以下几个命令: spawn命令: 在ssh自动登陆脚本中,我们使用 expect命令: string与命令行返回的信息匹配后,expect会立刻向下执行脚本; set timeout命令: send命令: interact命令: 完成脚本 以下是一个完成版的脚本 test.sh: #!/usr/bin/expect // 指定shebang set timeout 3 // 设定超时时间为3秒 spawn ssh user_name@172.***.***.*** // fork一个子进程执行ssh命令 expect "*password*" // 期待匹配到 'user_name@ip_string's password:' send "my_password\r" // 向命令行输入密码并回车 send "sudo -s\r" send "cd /data/logs\r" // 帮我切换到常用的工作目录 interact // 允许用户与命令行交互 执行 运行 简单的几个命令,,搭配起来解决了与命令行的交互问题后,很多复杂的功能也不在话下了~ alias别名 脚本完成了,可是还是有些小瑕疵:
这里我们想到了linux的alias命令: alias命令: 可是,我们会发现,当你关闭当前shell后,再打开一个shell窗口,再使用alias_name,系统提示command not found; 有没有能保持命令的方式呢?编辑bash_profile文件。 bash_profile文件 执行命令vim ~./bash_profile,在文件内部添加: alias alias_name="/root_dir/../file_name.sh 保存后,再使用 . ~./bash_profile或source ~./bash_profile 在当前脚本执行一遍设置别名命令,完成设置; 这样,我们无论在哪个目录,只要输入alias_name命令,回车,真正的一键登陆! 总结 作为一个程序猿,时刻保持着偷懒意识(当然此偷懒非彼偷懒。。。),在类unix系统中,不要浪费了shell这种神奇的工具,让计算机为我们服务~ 到此这篇关于shell实现SSH自动登陆的方法示例的文章就介绍到这了,更多相关shell SSH自动登陆内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论