今年来公司配了mac,全部的开发环境都从新部署了一遍,因为都是在开发机上运行项目的,免不了在开发机上操做各类,ssh固然是必须的,可是mac下不熟悉,每次ssh命令行,再输入密码太讨厌了,因此想了使用shell脚本自动登陆到开发机,而后进行各类操做,搜索了下,代码以下:mysql
#!/usr/bin/expect -f // 指定shebang set timeout 10 set pass "password" spawn ssh root@xx.xx.xx.xx expect "password" send "$pass\r" interact
咱们写一个shell脚本时,老是习惯在最前面加上一行 #!/binbash
,它就是脚本的shebang
,至于为何叫这么个奇怪的名字,C语言和Unix的开发者丹尼斯·里奇称它为多是相似于"hash-bang"的英国风描述性文字
;sql
贴一段wiki上的解释:shell
在计算机科学中,Shebang是一个由井号和叹号构成的字符串行,其出如今文本文件的第一行的前两个字符。 在文件中存在Shebang的状况下,类Unix操做系统的程序载入器会分析Shebang后的内容,将这些内容做为解释器指令,并调用该指令,并将载有 Shebang的文件路径做为该解释器的参数。数据库
简单的说,它指示了此脚本运行时的解释器,因此,使用文件名直接执行shell脚本时,必须带上shebang; 此外,咱们还能够在shebang后面直接附加选项,执行时咱们默认使用选项执行;bash
如 test.sh
的shebang
为 #!/bin/sh -x
,那咱们执行脚本时:ssh
./test.sh hello
学习
至关于:spa
bin/sh -x ./test.sh hello
;操作系统
而编写一个ssh自动登录脚本,须要用到的shebang(解释器)为 /usr/bin/expect
;命令行
须要注意的是:在指定脚本解释器来执行脚本时,shebang会被指定的脚本解释器覆盖,即优先使用指定的脚本解释器来执行脚本(习惯性地用sh ./test.sh却提示command not found)。
解释下命令:
expect解释器
expect是一个能实现自动和交互式任务的解释器,它也能解释常见的shell语法命令,其特点在如下几个命令:
spawn command
命令会fork一个子进程去执行command命令,而后在此子进程中执行后面的命令;
在ssh自动登录脚本中,咱们使用 spawn ssh user_name@ip_str
,fork一个子进程执行ssh登录命令;
expect命令是expect解释器的关键命令,它的通常用法为 expect "string"
,即指望获取到string字符串,可在在string字符串里使用 * 等通配符;
string与命令行返回的信息匹配后,expect会马上向下执行脚本;
set timeout n
命令将expect命令的等待超时时间设置为n秒,在n秒内尚未获取到其期待的命令,expect 为false,脚本会继续向下执行;
send命令的通常用法为 send "string"
,它们会咱们日常输入命令同样向命令行输入一条信息,固然不要忘了在string
后面添加上 \r
表示输入回车;
interact命令很简单,执行到此命令时,脚本fork的子进程会将操做权交给用户,容许用户与当前shell进行交互。
写好脚本保存以后,再经过chmod赋予执行权限,就能够执行了./xxx.sh
经过以上的学习能够依样画葫芦,写几个其它的自动脚本,
数据库执行的(导入,导出):
#!/usr/bin/expect -f set timeout 10 set pass "serverpass" set dbpass "dbpassword" spawn ssh root@xx.xx.xx.xx expect "password" send "$pass\r" expect "~]#" send "mysqldump -h xx.xx.xx -P3306 -u user -p databases table1 table2> /home/chaos/topic.sql \r" expect "Enter password:" send "$dbpass\r" interact
scp传递文件的脚本:
#!/usr/bin/expect -f set timeout 10 set pass "serverpass" spawn scp -r /Users/chaos/work/data/hotuser.sql root@xx.xx.xx.xx:/home/chaos expect "root@xx.xx.xx.xx's password:" send "$pass\r" interact
主要就是spawn 命令不一样,看返回须要输入什么,send什么过去就能够了。
ps:这个脚本都用大半年了,最近才有空记录下,真是变懒了好多,罪过罪过😓