shell实现SSH自动登陆

前言

庄开应用docker,每次登陆自己开发机总要输入
ssh user_name@ip_string,然后还确认输入password,手快了还时不时会面输错。作为一个懒人,肯定使摸一个取巧的方式,查看了下ssh命令,由于它使开展相同差与服务器的加密交互,所以无一直附带密码登陆的挑项,只好作罢。

前方数天在同事进行技能分享时,看到他甚至就输入了同履命令./test.sh便水到渠成登陆了开发机,甚是惊叹,于是回到找研究了一晃,遂成此文。


shell脚本基础

以编制ssh自动登陆脚本之前,先说一下shell脚本的底蕴,此基础不是片语法什么的,网上到处都是,这里总结了一晃shell脚本的运行机制~

shell脚本的运行方式

首先要说一下shell的几种植启动方式,正是踩了本子启动之坑,才使用原来十分钟就为定的台本,花了个别独钟头才搞定。同时为叫我们运行shell,知其所以然。

透过文件称实施

shell脚本可以一直通过文件称推行,需要留意的是文件需要实施权。通过
sudo chmod +x ./file_name.sh 来吃文件添加执行权;

指定脚本解释器来执行文书

俺们经常因此之 sh file_name.sh 就是指定了本子解释器
/bin/sh来诠释实施脚本;常见的剧本解释器还有:/bin/bash相当,我们可下ls -l /bin/*sh命令来查时可用之剧本解释器;

使用. ./file_name或source命令执行脚本

这种方法不会见像前少种方法同fork一个子进程去实施脚本,而是下时shell环境实行,用于
.bashrc或者.bash_profile被改动的时刻,我们不要再度开shell或者重新登录系统,就能要当前之改生效。

shebang

俺们描绘一个shell脚本时,总是习惯以最好前方加上一行
#!/binbash,它就是本子的shebang,至于怎么吃这么个想不到的名,C语言和Unix的开发者丹尼斯·里奇称它呢可能是类似于"hash-bang"的英国风描述性文字

贴平段wiki上的讲:

当微机对中,Shebang是一个是因为井号和叹号构成的字符串行,其出现于文书文件的率先履之前片个字符。
在文件被在Shebang的状下,类Unix操作系统的顺序载入器会分析Shebang后底内容,将这些内容作解释器指令,并调用该令,并以载有Shebang的公文路径作为该解释器的参数。

简的游说,它指示了这个脚论运行时的解释器,所以,使用文件称一直实施shell脚本时,必须带上shebang;
此外,我们还足以当shebang后面一直附加选项,执行时我们默认使用选择执行;

test.shshebang#!/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命令:

spawn command令会fork一个子经过去实施command命令,然后以此子进程遭到实践后的授命;

当ssh自动登陆脚本中,我们采取
spawn ssh user_name@ip_str,fork一个子历程执行ssh登陆命令;

expect命令:

expect命令是expect解释器的关键命令,它的一般用法呢
expect "string",即希望获取到string字符串,可当以string字符串里采取 *
等通配符;

string与命令执行返回的消息匹配后,expect会立刻为下执行脚本;

set timeout命令:

set timeout n一声令下将expect命令的守候超时时间设置也n秒,在n秒内还并未得到那要的指令,expect
为false,脚本会继续朝着下实行;

send命令:

send命令的形似用法为
send "string",它们会我们平常输入指令一样为命令执行输入一长消息,当然绝不遗忘了以string末端加加上
\r 表示输入回车;

interact命令:

interact命令很简单,执行到这个命令时,脚论fork的子进程会将操作权交给用户,允许用户与眼前shell进行相互;


得台本

以下是一个完事本的脚本 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                            // 允许用户与命令行交互

执行 sudo chmod +x ./test.sh命令于shell脚本添加执行权;

运行 ./test.sh指令,一键登陆成功!

粗略的几乎单指令,,搭配起来解决了与命令行的相问题后,很多扑朔迷离的功用为非以讲话下了~


alias别名

剧本完成了,可是还是发把稍瑕疵:

  • 输入./file_name.sh令太长。。。
  • 惟有会以本子目录中才能够履行,不然使用绝对路径输出的指令还增长。

此间我们想到了linux的alias命令:

alias命令:

alias命令下方法吗
alias alias_name="ori_command",将alias_name设置为ori_command的号,这样我们输入执行alias_name,就一定给履行了ori_command;

然而,我们见面发觉,当你关闭时shell后,再打开一个shell窗口,再采取alias_name,系统提醒command not found;

发出无发生会保全命令的道吗?编辑bash_profile文件。

bash_profile文件

我们编辑bash_profile文件,此文件会当巅峰窗口创建的时段首先实施同样涂鸦,所以可以协助咱重装同样不成别名;

执行命令vim ~./bash_profile,在文件中添加:

alias alias_name="/root_dir/../file_name.sh

保存后,再使用 . ~./bash_profilesource ~./bash_profile
在时剧本执行同样所有设置别叫命令,完成安装;

如此,我们管以谁目录,只要输入alias_name指令,回车,真正的如出一辙键登陆!


总结

当一个程序猿,时刻保持着偷懒察觉(当然这个偷懒非彼偷懒。。。),在类unix系统遭到,不要浪费了shell这种神奇之工具,让电脑为咱服务~

一个几近月没写博客了,最近于看APUE,UNP一学的题,C和Unix上入门尚浅,不敢胡乱刻画误人子弟;平常自己因此记事本做的笔记也较散乱,不成为网;

日益积攒吧,有宜的花色会写的,欢迎大家关注~