C语言shell完毕SSH自动登6

前言

公司支付使用docker,每回登6本身开发机总要输入
ssh user_name@ip_string,然后再确认输入password,手快了还时时会输错。作为一个懒人,肯定要找贰个取巧的艺术,查看了下ssh命令,由于它要拓展叁次跟服务器的加密交互,所以未有直接附带密码登6的选项,只可以作罢。

今日在同事进行技术分享时,看到他竟是只输入了壹行命令./test.sh就水到渠成登6了开发机,甚是惊异,于是回到搜索研讨了一下,遂成此文。


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

大家写3个shell脚本时,总是习惯在最前面加上一行
#!/binbash,它就是本子的shebang,至于何以叫这么个想不到的名字,C语言和Unix的开发者丹布尔萨·Richie称它为可能是类似于"hash-bang"的英国风描述性文字

贴一段wiki上的解释:

在微型总括机科学中,Shebang是2个由井号和叹号构成的字符串行,其冒出在文件文件的首先行的前多少个字符。
在文书中留存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一声令下会fork1个子历程去实践command命令,然后在此子进度中执行前边的通令;

在ssh自动登六脚本中,大家采取
spawn ssh user_name@ip_str,fork三个子进程执行ssh登6命令;

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进行相互;


姣好剧本

以下是1个成功版的脚本 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后,再打开2个shell窗口,再利用alias_name,系统提醒command not found;

有未有能维系命令的方法啊?编辑bash_profile文件。

bash_profile文件

大家编辑bash_profile文件,此文件会在巅峰窗口成立的时候首先实施二次,所以能够帮我们再设置1遍别名;

执行命令vim ~./bash_profileC语言,,在文书之中添加:

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

保存后,再使用 . ~./bash_profilesource ~./bash_profile
在现阶段剧本执行一次设置外号命令,完结安装;

那样,大家无论在哪些目录,只要输入alias_name命令,回车,真正的1键登陆!


总结

用作二个程序猿,时刻保持着偷懒发现(当然此偷懒非彼偷懒。。。),在类unix系统中,不要浪费了shell那种神奇的工具,让电脑为我们服务~

二个多月没写博客了,近期在看APUE,UNP一套的书,C和Unix上入门尚浅,不敢乱写误人子弟;日常本人用记事本做的笔记也相比较混乱,不成类别;

渐渐积攒吧,有确切的门类会写的,欢迎我们关切~