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 // 指定shebangset 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_profile
或source ~./bash_profile
在当前脚本执行一遍设置别名命令,完成设置;
这样,我们无论在哪个目录,只要输入alias_name
命令,回车,真正的一键登陆!
来源:http://www.cnblogs.com/zhenbianshu/p/5867440.html
shell脚本中执行ssh相关推荐
- 在 Shell 脚本中执行语法检查调试模式
文章目录 shell 脚本调试系列 概述 启用 verbose 调试模式 在 Shell 脚本中启用语法检查调试模式 通过修改脚本的首行来启用脚本检查 内置的 set 命令来在脚本中启用调试模式 sh ...
- shell脚本中执行命令_如何在Shell脚本中执行命令?
shell脚本中执行命令 Shell is a command-line interpreter that allows the user to interact with the system. I ...
- 如何在 Shell 脚本中执行语法检查调试模式
我们开启了 Shell 脚本调试系列文章,先是解释了不同的调试选项,下面介绍如何启用shell调试模式. 写完脚本后,建议在运行脚本之前先检查脚本中的语法,而不是查看它们的输出以确认它们是否正常工作. ...
- shell脚本中执行 source /etc/profile 或者 source ~/.bashrc 不能生效的原因
执行脚本时,其中的命令是在一个子shell中执行的.子shell继承了父shell的环境变量,但无法修改他们,或者说所做的修改仅对子shell有效.所以当shell脚本执行完后,到了回到shell命令 ...
- 如何在Linux Shell脚本中执行MongoDB命令
今天有同事问到了,简单的写两个应用. 方法一 shell脚本代码如下: #! /bin/bash./mongo 127.0.0.1:27017/test <<EOFvar cursor ...
- 服务器执行sh文件或目录,将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法...
出现bad interpreter:No such file or directory的原因,是文件格式的问题.这个文件是在Windows下编写的.换行的方式与Unix不一样,但是在vim下面如果不S ...
- shell脚本中执行mysql 语句,去除warning using a password on the command line interface can be insecure信息...
方法二:使用mysql参数的方法 mysql -u$user -p$pass -D $db -e "select host from user;" 当然,可以通过将传参的方式来传递 ...
- 在 Shell 脚本中跟踪调试命令的执行
文章目录 shell 脚本调试系列 概述 shell 跟踪执行的重要性 shell 脚本调试系列 本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的 ...
- linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式
主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...
- shell脚本中实现远程和其他用户的子shell执行
shell脚本中实现远程和其他用户的子shell执行 文章目录 shell脚本中实现远程和其他用户的子shell执行 shell远程用户执行脚本 简单执行-单行形式的命令 脚本执行-对于命令行太多的采 ...
最新文章
- Win7环境配置Oracle 11g安装与配置过程
- wannalfy 挑战赛8 F 白云的树(树形dp)
- 【学习笔记】JDBC:java提供的专门操纵数据库的API JDBC驱动程序的类型 JDBC常用的类与接口
- 剑指Offer - 面试题50. 第一个只出现一次的字符(unordered_map)
- Fatal error: Call to undefined function: mysql_connect() 的解决
- 小米公布Q1手机出货量:驳斥暴跌谣言
- python实现给定信号生成任意信噪比的带噪声信号
- IDC评述网:1月下旬国内域名注册商净增量Top10
- wps怎么把当前页面设置为横向_办公软件操作技巧011:如何将word文档的部分页面改为横向...
- [译] 五个小技巧让你写出更好的 JavaScript 条件语句
- 分享java50道基础面试题(有答案)
- appium java模拟微信登录,使用Appium 测试微信小程序和微信公众号方法
- latex 表格居中
- linux 命令两个冒号,为什么两个冒号的错误消息作为bash中的命令(::)有三个冒号,但是一个冒号没有输出?...
- 移动硬盘格式化了?可以这样恢复数据
- TreeGrid插件简练了解使用
- 计算机云共享盘,搭建私人云网盘:局域网访问共享数据
- USACO_Wormholes
- 科研—画图图片处理1
- python中import string是什么意思_Python之string模块(详细讲述string常见的所有方法)...
热门文章
- 用python画竹子_基于Python的一个简单爬虫(糗事百科爬虫)
- 串口(RS - 232)
- HDU - 6438 Buy and Resell (贪心 + 优先队列)
- 常见大数据应用有哪些?
- 除权除息,前复权,后复权,不复权
- 云上架构和传统IT架构的区别在哪里?(企业CIO、CTO必读)
- 基于JavaWeb的餐厅点餐系统设计与实现
- 星巴克中国咖啡创新产业园正式动工,追加项目总投资至近11亿元
- 客厅经济回潮,强势崛起的OTT大屏如何赢得广告主选择?
- 计算机用word做海报,【2人回答】电脑Word怎么做海报?-3D溜溜网