如何编写无须人工干预的shell脚本?

在使用基本的一些shell命令时,机器需要与人进行互动来确定命令的执行。比如 cp test.txt boo/test.txt,会询问是否覆盖?ssh远程登陆时,需要输入人工密码后,才可以继续执行ssh命令等等。如何编写可以自动与shell交互的命令行,而不再需要人工介入呢?expect于此横空出世。

“Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年 开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。使用它系统管理员 的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。”

下面我们安装下expect,并做简单的测试,确保正确使用expect脚本。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。

expect下载地址

http://download.chinaunix.net/download/0003000/2845.shtml

tcl下载地址

http://download.chinaunix.net/download/0001000/22.shtml

1。先安装tcl

  进入tcl解压目录,然后进入unix目录

  #./configure

  #make

  #make install

2.后安装expect

  进入expect解压目录

  #./configure --with-tclinclude=/usr/src/tcl8.4.19/generic/ --with-tclconfig=/usr/local/lib/

  #make

  #make install

完成,测试

  #expect

  expect1.1>

  expect1.1>

一切OK,安装成功。

编写一个测试脚本,测试expect按正常运行。touch test.exp,文件以exp结尾或tcl结尾,都可以执行。注【spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命 令的。】

###author:[email protected]

#!/usr/local/bin/expect

set timeout 30

set password zhishi2016&*!db1

spawn ssh -l root 118.76.22.83 -p 14010

expect "*assword:" { send "$password\n"}

expect "*#"

send "echo success,we get into the remote directory!\r"

expect "100%"

expect eof

interact

保存后,运行expect test.exp,成功后输出:success,we get into the remote directory!

expect先介绍到这里,深入了解可翻阅网络相关资料。

时间: 2024-10-16 01:38:46

如何编写无须人工干预的shell脚本?的相关文章

编写简单的Shell脚本

在一些复杂的Linux维护工作中,大量重复性的输入和操作不但费时费力,而且容易出错,而编写一个恰到好处的shell脚本程序,可以批量处理.自动化的完成一系列维护任务,大大减轻了管理员的负担 shell脚本基础 1. 编写第一个shell脚本 Linux中的shell脚本是一个特殊的应用程序,介于操作系统内核和用户之间,充当了一个命令解释器的角色,负责接收用户的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果 常见的shell解释器 可通过/etc/shells文件了解当前系统所

跟着老刘学《Linux就该这么学》第五天--编写Shell脚本

编写Shell脚本可以将Shell终端解释器当作人与计算机硬件之间的"翻译官",它作为用户与Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环.分支等高级编程语言才有的控制结构特性.要想正确使用Shell中的这些功能特性,准确下达命令尤为重要.Shell脚本命令的工作方式有两种:交互式和批处理. 交互式(Interactive):用户每输入一条命令就立即执行. 批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命

Java面试12|Linux及Shell脚本

1.关于awk命令的面试题 (1)最近登录的5个帐号 last -n 5 | awk -F ':'(指定域分割符号) '{print $1}' -n表示number,有多少行需要显示.读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域.默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推. (2)用awk统计文本行数 awk '{count

下载Google官方/CM Android源代码自动重新开始的Shell脚本

国内由于某种原因,下载CM或Google官方的Android源代码总容易中断.总看着机器,一中断就重新执行repo sync还太麻烦,所以我特意编写了一段shell脚本(download.sh).通过获取shell最后返回的状态码来决定是否再次执行repo sync命令. #!/bin/bash echo "======start repo sync======" repo sync # 第一次下载android源代码 while [ $? != 0 ]; do echo "

LNMP一键安装shell脚本(v1.2)

鉴于搭建一个LNMP环境使用一步一步的方法安装比较笨拙,故将安装步骤编写成一个简单shell脚本,并且能实现大部分需求 适合的系统版本:CentOS6.5-6.7 64位 安装的前提准备: mysql-5.6.28.tar.gz cmake-3.4.3.tar.gz nginx-1.8.1.tar.gz libgd-2.1.1.tar.bz2 ibiconv-1.14.tar.gz jpegsrc.v6b.tar.gz php-5.6.20.tar.bz2 将以上的源码包download下来放并

shell脚本学习指南

以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bash shell 脚本的第一行,#!之后应该是什么? 如果拿这个问题去问别人,不同的人的回答可能各不相同.我见过/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin/env sh.这算是编程界的“’茴’字四种写法”了. 在多数情况下,以上五种写法都是等价的.但是,写过程序的人都知道:“少数情况”里往往隐藏

使用C#给Linux写Shell脚本

在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之后跑去群子了威吓其他群友,不就是个玩嘛,走着~~! 说起Linux中的脚本,毋庸置疑,用得最多的肯定是Shell脚本,其他的还有Python.Ruby等,估计根本没有人会想到其实C#也可以.说起C#,那可是尚方宝剑版存在,它上可写操作系统(CosmosOS.SharpOS等)下可写应用系统,桌面程序

shell脚本基础命令学习(一)

shell的作用是解析用户的指令,将shell指令按照特定的流程,组合形成脚本. 查看当前系统shell版本: 编写一个简单的shell脚本后,可以使用下面几种方法来执行: 1,使用chmod给脚本增加x权限,如:chmod +x test.sh 2,/bin/sh 或者 /bin/bash 执行脚本(会创建子进程) 3,source ./test.sh 脚本执行 4,小括号方式,会创建子进程 环境变量,可以直接设置,例如var=100,使用unset var可以删除 通配符: * 匹配一个或多

dotnetcore执行shell脚本

我们可以使有dotnetcore跨平台的特性,优雅的实现在dotnetcore执行shell (bash).  代码如下: using System; using System.Collections.Generic; using System.Text; namespace hshoc { using System.Diagnostics; public static class ShellHelper { public static string Bash(this string cmd)