侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130557 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

shell脚本的应用

2023-12-22 星期五 / 0 评论 / 0 点赞 / 76 阅读 / 4705 字

今年来公司配了mac,所有的开发环境都重新部署了一遍,由于都是在开发机上运行项目的,免不了在开发机上操作各种,ssh当然是必须的,但是mac下不熟悉,每次ssh命令行,再输入密码太讨厌了,所以想了使用

今年来公司配了mac,所有的开发环境都重新部署了一遍,由于都是在开发机上运行项目的,免不了在开发机上操作各种,ssh当然是必须的,但是mac下不熟悉,每次ssh命令行,再输入密码太讨厌了,所以想了使用shell脚本自动登录到开发机,然后进行各种操作,搜索了下,代码如下:

#!/usr/bin/expect -f // 指定shebangset timeout 10set pass "password"spawn ssh [email protected] "password"send "$pass/r"interact

shebang

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

贴一段wiki上的解释:

.

在计算机科学中,Shebang是一个由井号和叹号构成的字符串行,其出现在文本文件的第一行的前两个字符。 在文件中存在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命令会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进行交互。

写好脚本保存之后,再通过chmod赋予执行权限,就可以执行了./xxx.sh

通过以上的学习可以依样画葫芦,写几个其它的自动脚本,

数据库执行的(导入,导出):

#!/usr/bin/expect -fset timeout 10set pass "serverpass"set dbpass "dbpassword"spawn ssh [email protected] "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 -fset timeout 10set pass "serverpass"spawn scp -r /Users/chaos/work/data/hotuser.sql [email protected]:/home/chaosexpect "[email protected]'s password:"send "$pass/r"interact

主要就是spawn 命令不同,看返回需要输入什么,send什么过去就可以了。

ps:这个脚本都用大半年了,最近才有空记录下,真是变懒了好多,罪过罪过

广告 广告

评论区