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.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命令:
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,在⽂件内部添加:
shell最简单脚本alias alias_name="/root_dir/../file_name.sh
保存后,再使⽤ . ~./bash_profile或source ~./bash_profile 在当前脚本执⾏⼀遍设置别名命令,完成设置;
这样,我们⽆论在哪个⽬录,只要输⼊alias_name命令,回车,真正的⼀键登陆!
总结
作为⼀个程序猿,时刻保持着偷懒意识(当然此偷懒⾮彼偷懒。。。),在类unix系统中,不要浪费了shell这种神奇的⼯具,让计算机为我们服务~
到此这篇关于shell实现SSH⾃动登陆的⽅法⽰例的⽂章就介绍到这了,更多相关shell SSH⾃动登陆内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。