您的位置:首页 > 教程 > linux > shell实现SSH自动登陆的方法示例

shell实现SSH自动登陆的方法示例

2022-06-19 11:37:58 来源:易采站长站 作者:

shell实现SSH自动登陆的方法示例

这篇文章主要介绍了shell实现SSH自动登陆的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧bby站长之家-易采站长站-Easck.Com

前言bby站长之家-易采站长站-Easck.Com
bby站长之家-易采站长站-Easck.Com

公司开发使用docker,每次登陆自己开发机总要输入 ssh user_name@ip_string,然后再确认输入password,手快了还经常会输错。作为一个懒人,肯定要找一个取巧的方式,查看了下ssh命令,由于它要进行一次跟服务器的加密交互,所以没有直接附带密码登陆的选项,只好作罢。bby站长之家-易采站长站-Easck.Com

前些天在同事进行技术分享时,看到他竟然只输入了一行命令./test.sh就成功登陆了开发机,甚是惊异,于是回来搜索研究了一下,遂成此文。bby站长之家-易采站长站-Easck.Com

shell脚本基础bby站长之家-易采站长站-Easck.Com
bby站长之家-易采站长站-Easck.Com

在编写ssh自动登陆脚本之前,先说一下shell脚本的基础,此基础不是一些语法什么的,网上到处都是,这里总结了一下shell脚本的运行机制~bby站长之家-易采站长站-Easck.Com

shell脚本的运行方式bby站长之家-易采站长站-Easck.Com
bby站长之家-易采站长站-Easck.Com

首先要说一下shell的几种启动方式,正是踩了脚本启动的坑,才使用原来十分钟就搞定的脚本,花了两个小时才搞定。同时也使得我们运行shell,知其所以然。bby站长之家-易采站长站-Easck.Com

通过文件名执行bby站长之家-易采站长站-Easck.Com
shell脚本可以直接通过文件名执行,需要注意的是文件需要执行权限。通过 sudo chmod +x ./file_name.sh 来给文件添加执行权限;bby站长之家-易采站长站-Easck.Com

指定脚本解释器来执行文件bby站长之家-易采站长站-Easck.Com
我们常用的 sh file_name.sh 就是指定了脚本解释器 /bin/sh来解释执行脚本;常见的脚本解释器还有:/bin/bash等,我们可以使用ls -l /bin/*sh命令来查看当前可用的脚本解释器;bby站长之家-易采站长站-Easck.Com

使用. ./file_name或source命令执行脚本bby站长之家-易采站长站-Easck.Com
这种方式不会像前两种方式一样fork一个子进程去执行脚本,而是使用当前shell环境执行,用于 .bashrc或者.bash_profile被修改的时候,我们不必重启shell或者重新登录系统,就能使当前的更改生效。bby站长之家-易采站长站-Easck.Com

shebangbby站长之家-易采站长站-Easck.Com
bby站长之家-易采站长站-Easck.Com

我们写一个shell脚本时,总是习惯在最前面加上一行 #!/binbash,它就是脚本的shebang,至于为什么叫这么个奇怪的名字,C语言和Unix的开发者丹尼斯里奇称它为可能是类似于"hash-bang"的英国风描述性文字;bby站长之家-易采站长站-Easck.Com

贴一段wiki上的解释:bby站长之家-易采站长站-Easck.Com

在计算机科学中,Shebang是一个由井号和叹号构成的字符串行,其出现在文本文件的第一行的前两个字符。 在文件中存在Shebang的情况下,类Unix操作系统的程序载入器会分析Shebang后的内容,将这些内容作为解释器指令,并调用该指令,并将载有Shebang的文件路径作为该解释器的参数。bby站长之家-易采站长站-Easck.Com

简单的说,它指示了此脚本运行时的解释器,所以,使用文件名直接执行shell脚本时,必须带上shebang; 此外,我们还可以在shebang后面直接附加选项,执行时我们默认使用选项执行;bby站长之家-易采站长站-Easck.Com

如 test.sh的shebang为 #!/bin/sh -x,那我们执行脚本时:bby站长之家-易采站长站-Easck.Com

./test.sh hello

相当于:bby站长之家-易采站长站-Easck.Com

bin/sh -x ./test.sh hello;

而编写一个ssh自动登陆脚本,需要用到的shebang(解释器)为 /usr/bin/expect;bby站长之家-易采站长站-Easck.Com

需要注意的是:在指定脚本解释器来执行脚本时,shebang会被指定的脚本解释器覆盖,即优先使用指定的脚本解释器来执行脚本(习惯性地用sh ./test.sh却提示command not found)bby站长之家-易采站长站-Easck.Com

expect解释器bby站长之家-易采站长站-Easck.Com
bby站长之家-易采站长站-Easck.Com

expect是一个能实现自动和交互式任务的解释器,它也能解释常见的shell语法命令,其特色在以下几个命令:bby站长之家-易采站长站-Easck.Com

spawn命令:bby站长之家-易采站长站-Easck.Com
spawn command命令会fork一个子进程去执行command命令,然后在此子进程中执行后面的命令;bby站长之家-易采站长站-Easck.Com

在ssh自动登陆脚本中,我们使用 spawn ssh user_name@ip_str,fork一个子进程执行ssh登陆命令;bby站长之家-易采站长站-Easck.Com

expect命令:bby站长之家-易采站长站-Easck.Com
expect命令是expect解释器的关键命令,它的一般用法为 expect "string",即期望获取到string字符串,可在在string字符串里使用 * 等通配符;bby站长之家-易采站长站-Easck.Com

string与命令行返回的信息匹配后,expect会立刻向下执行脚本;bby站长之家-易采站长站-Easck.Com

set timeout命令:bby站长之家-易采站长站-Easck.Com
set timeout n命令将expect命令的等待超时时间设置为n秒,在n秒内还没有获取到其期待的命令,expect 为false,脚本会继续向下执行;bby站长之家-易采站长站-Easck.Com

send命令:bby站长之家-易采站长站-Easck.Com
send命令的一般用法为 send "string",它们会我们平常输入命令一样向命令行输入一条信息,当然不要忘了在string后面添加上 \r 表示输入回车;bby站长之家-易采站长站-Easck.Com

interact命令:bby站长之家-易采站长站-Easck.Com
interact命令很简单,执行到此命令时,脚本fork的子进程会将操作权交给用户,允许用户与当前shell进行交互;bby站长之家-易采站长站-Easck.Com

完成脚本bby站长之家-易采站长站-Easck.Com
bby站长之家-易采站长站-Easck.Com

以下是一个完成版的脚本 test.sh:bby站长之家-易采站长站-Easck.Com

#!/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脚本添加执行权限;bby站长之家-易采站长站-Easck.Com

运行 ./test.sh命令,一键登陆成功!bby站长之家-易采站长站-Easck.Com

简单的几个命令,,搭配起来解决了与命令行的交互问题后,很多复杂的功能也不在话下了~bby站长之家-易采站长站-Easck.Com

alias别名bby站长之家-易采站长站-Easck.Com
bby站长之家-易采站长站-Easck.Com

脚本完成了,可是还是有些小瑕疵:bby站长之家-易采站长站-Easck.Com

输入./file_name.sh命令太长。。。
只能在脚本目录中才能执行,不然使用绝对路径输出的命令更长。

这里我们想到了linux的alias命令:bby站长之家-易采站长站-Easck.Com

alias命令:bby站长之家-易采站长站-Easck.Com
alias命令使用方式为 alias alias_name="ori_command",将alias_name设置为ori_command的别名,这样我们输入执行alias_name,就相当于执行了ori_command;bby站长之家-易采站长站-Easck.Com

可是,我们会发现,当你关闭当前shell后,再打开一个shell窗口,再使用alias_name,系统提示command not found;bby站长之家-易采站长站-Easck.Com

有没有能保持命令的方式呢?编辑bash_profile文件。bby站长之家-易采站长站-Easck.Com

bash_profile文件bby站长之家-易采站长站-Easck.Com
我们编辑bash_profile文件,此文件会在终端窗口创建的时候首先执行一次,所以可以帮我们再设置一次别名;bby站长之家-易采站长站-Easck.Com

执行命令vim ~./bash_profile,在文件内部添加:bby站长之家-易采站长站-Easck.Com

alias alias_name="/root_dir/../file_name.shbby站长之家-易采站长站-Easck.Com

保存后,再使用 . ~./bash_profile或source ~./bash_profile 在当前脚本执行一遍设置别名命令,完成设置;bby站长之家-易采站长站-Easck.Com

这样,我们无论在哪个目录,只要输入alias_name命令,回车,真正的一键登陆!bby站长之家-易采站长站-Easck.Com

总结bby站长之家-易采站长站-Easck.Com
bby站长之家-易采站长站-Easck.Com

作为一个程序猿,时刻保持着偷懒意识(当然此偷懒非彼偷懒。。。),在类unix系统中,不要浪费了shell这种神奇的工具,让计算机为我们服务~bby站长之家-易采站长站-Easck.Com

到此这篇关于shell实现SSH自动登陆的方法示例的文章就介绍到这了,更多相关shell SSH自动登陆内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!bby站长之家-易采站长站-Easck.Com

如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • Linux下用GHOST来做系统备份

    Linux下用GHOST来做系统备份

    在Windows系统下备份我们可以用GHOST工具软件完成,Linux系统不能完全依赖于GHOST工具,一则是GHOST本身是有版权的软件,二是GHOST只支持ext2、ext3文件系统的Linux分区,不支持reiserfs、xfs等
    2019-10-25
  • 给 FreeBSD 12.1 安装 GNOME3 图形界面

    给 FreeBSD 12.1 安装 GNOME3 图形界面

    FreeBSD是一个完全开放的、安全的系统,可以Do it yourself的系统。但是个人还是不喜欢呆板的命令行界面,所有就给 FreeBSD 12.1 安装 GNOME3 图形界面。 开始操作,启动FreeBSD 12.1,以root身份
    2019-10-27
  • Ubuntu Studio一个不错的操作系统

    Ubuntu Studio一个不错的操作系统

    Ubuntu Studio 是一个基于 Ubuntu 而面向音频、视频及图形爱好者的操作系统。本次推出的 Ubuntu Studio 为 7.04 版,目前仅支持 Intel i386 兼容的处理器。 Ubuntu Studio 从大量的开源多媒体创作程序
    2019-10-25
  • 最受欢迎的10款Linux免费游戏

    最受欢迎的10款Linux免费游戏

    图为在Linux下运行的免费游戏America's Army 如果你认为 Linux下没有什么好游戏的话,那就错了!我们来看看Linux下最受欢迎的10款游戏吧,而且这些游戏都是完全免费的! # skyreal update(06-12
    2019-10-25
  • compiz fusion特效使用心得(附3D桌面图)

    compiz fusion特效使用心得(附3D桌面图)

    3D桌面图 LINUX发行版就是好,当大多数人还在沉迷于那些什么风格图标鸟玻璃效果甚至孜孜不倦津津乐道的时候,Linux的高手们已经悄悄为我们开启了一个桌面系统3D的时代。 当我第一次
    2019-10-25
  • Ubuntu 下aMule 的安装配置

    Ubuntu 下aMule 的安装配置

    aMule 是一个类似于 eMule 的多平台 P2P 客户端程序。以下将简略叙述 aMule 在 Ubuntu 中的安装及配置 [High ID] 与 [KAD] 的过程。 安装: sudo apt-get install amule sudo apt-get install amule-utils 如果需要
    2019-10-25
  • JMeter jp@gc - stepping thread group插件

    JMeter jp@gc - stepping thread group插件

    这是一个出单接口压力测试的小例子,了解一下压力测试最最基础的基础。出单接口是用来保险出单的,不需要在UI界面下一步下一步的出单,接口一调数据入库完事~~~。再啰嗦一句接
    2019-10-27
  • Ubuntu 下使用K3B软件刻录光盘(图)

    Ubuntu 下使用K3B软件刻录光盘(图)

    不知大家会不会在Ubuntu下刻录光盘呢?k3b是KDE环境下的一个CD/DVD刻录软件,有非常容易使用的界面,功能比较齐全。用起来感觉就象是win下的Nero一样简单自然,比ubuntu里原来的刻录CD方式
    2019-10-25