交互式命令 expect

shell尽管很强大。但是貌似无法完成交互式命令的操作,实例 ssh host 如果host而且该机没有加入信任。手动输入的时间需要password。

这样的情况下可以使用expect支持。

下面举个样例来说明expect的功能与使用:

功能:对集群各机器运行同样指令 如 集群ip 为 :192.168.6.1~192.168.6.10。须要在这10台机器上 同一时候 以tt用户登录 并运行 mkdir ttji_314命令。

首先 定义一个hostlist文件 :

192.168.6.1
192.168.6.2
192.168.6.3
192.168.6.4
192.168.6.5
192.168.6.6
192.168.6.7
192.168.6.8
192.168.6.9
192.168.6.10

然后定义一个 expect脚本 完毕在单个机器运行命令:ssh_comm.sh

#!/usr/bin/expect
set host [lindex $argv 0]
set command [lindex $argv 1]
set password 123456
set username tt
set timeout 1

send_user "connect to $host ...\n"
spawn ssh -l $username $host

expect "password:"
send "$password\r"

expect "#$"
send "$command\r"

expect "#$"
send "exit\r"

#interact
expect eof

几点说明 :

1 首行加上/usr/bin/expect

2 spawn: 后面加上须要运行的shell 命令

3 expect: 仅仅有spawn 运行的命令结果才会被expect 捕捉到,由于spawn 会启

动一个进程,仅仅有这个进程的相关信息才会被捕捉到。主要包含:标准输入的提

示信息,eof 和timeout。

4 send 和send_user:send 会将expect 脚本中须要的信息发送给spawn 启动

的那个进程,而send_user 仅仅是回显用户发出的信息,类似于shell 中的echo 而

已。

5.set timeout 1之后的指令将都等待1s。

最后完毕批量功能:command_all.sh

#!/bin/bash

function use() {
        echo "========================"
        echo "./command_all.sh hostlist command"
        echo "========================"
}

if [ $# != 2 ]
        then
                use
        else
                echo "welcome to use:\n"
fi

file=$1
command=$2

echo $file
echo $command

while read line
do
    #echo $line
    ./ssh_comm.sh $line "$command"
done < $file

使用:

./command_all.sh hostlist "mkdir ttji_314"

有个问题:当在expect脚本中 使用root用户登录的时候 似乎没有timeout这样的概念 ,运行完命令马上返回;

而用普通用户才会有这样的体现。

若有了解的同学请留言不吝赐教,不胜感激~

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-13 16:14:30

交互式命令 expect的相关文章

两种Linux下非交互式命令的实现

一.概述 在Linux环境,有多种实现自动化的脚本语言,如Shell.Python.Perl.Tcl等.Shell语言因与Shell外壳结合紧密,是最常见的实现自动化的脚本语言. 同时,在Linux环境中存在大量功能单一的小工具--通常它们在指定输入后,立即就可获得输出,例如echo.cat等字符串/文本打印工具,又或者是如sed.awk等最常用的字符串编辑工具.通过编写Shell脚本,我们可以反复利用这些小工具来实现一些自动化的批处理. 在少数情况下,我们也需要用到一些交互式的工具,例如pas

ssh执行非交互式命令

如果你想用脚本自动化登录到某台机子上,然后在上边执行个命令,怎么办呢? 可以使用ssh的非交互式命令 ssh [email protected] "/home/hczhang/bin/build.sh" 这里可以用expect模拟键盘输入将密码输入,也可以用无密码登录,具体就是将自己的公钥放在对端的authorized_keys里,登录的时候就不用输密码了,就是建立两台机子之间的信任关系,这里不多讲了. 那么如果你想执行sudo命令怎么办呢?比如: ssh [email protect

人机交互命令 expect

shell虽然很强大,但貌似无法完成人机交互命令的执行,比如 ssh host 若host与本机并未添加信任,则需要手动输入一次密码.这种情况可以用expect支持. 以下举个例子来说明expect的功能与使用: 功能:对集群各机器执行相同指令 如 集群ip 为 :192.168.6.1~192.168.6.10,需要在这10台机器上 同时 以tt用户登录 并执行 mkdir ttji_314命令: 首先 定义一个hostlist文件 : 192.168.6.1 192.168.6.2 192.

1001种玩法 | Python Prompt Toolkit:构建强大交互式命令行的 Python 工具库

Python Prompt Toolkit:构建强大交互式命令行的 Python 工具库 prompt_toolkit 是一个用于构建强大交互式命令行的 Python 工具库. 你是不是在找交互式的 Python shell 工具 ptpython 呢?我们把 ptpython 的源码转移到了一个独立的仓库.如此一来,我们确信  prompt_toolkit 库不会被其他 ptpython 东西"污染",并且 ptpython 也可以独立开发.现在必须用下面这个命令安装 ptpytho

Python多版本情况下四种快速进入交互式命令行的操作技巧

因为工作需求或者学习需要等原因,部分小伙伴的电脑中同时安装了Python2和Python3,相信在Python多版本的切换中常常会遇到Python傻傻分不清楚的情况,今天小编整理了四个操作技巧,以帮助大家解决这个"心头之痛". 1.直接在命令行窗口中输入命令"python",便可以进入命令行了,如下图所示. 不过此时默认弹出的是Python2版本,这是因为小编的电脑中Python的环境变量将Python2放在了Python3的前面,所以默认是弹出Python2版本.

Spark-Unit2-Spark交互式命令行与SparkWordCount

一.Spark交互式命令行 启动脚本:spark-shell 先启动spark:./start-all.sh 本地模式启动命令:/bin/spark-shell 集群模式启动命令:/bin/spark-shell --master spark://spark-1:7077 --total-executor-cores 2 --executor-memory 500mb //注释:spark集群模式默认使用全部的核心数,默认使用内存大小为1024Mb 1.用shell的集群模式去执行一个本地wor

1.10-1.11 hive交互式命令讲解

一.hive 交互式命令参数 #帮助 [[email protected] hive-0.13.1]# bin/hive -h Missing argument for option: h usage: hive -d,--define <key=value> Variable subsitution to apply to hive commands. e.g. -d A=B or --define A=B --database <databasename> Specify th

Inquirer 交互式命令行

1.简介 常见的交互式命令行用户界面的集合. https://www.npmjs.com/package/inquirer 2.示例(输入和单选) var inquirer = require('inquirer'); var questions = [ { type: 'input', name: 'name', message: "What's your name" }, { type: 'list', name: 'size', message: 'What size do yo

expect入门--自动化linux交互式命令

很多linux程序比如passwd,ftp,scp,ssh等自身并没有提供一种静默式的执行选项,而是依赖于运行时的终端输入来进行后一步的操作比如更改密码.文件上传.下载等.虽然有些编程语言如java嵌入了不少这些常用工具的API比如jcsh等,但是毕竟他们不够自然和顺手. expect是unix/linux下的一个命令行工具,其使用tcl作为编程语言开发.其主要的功能就是模拟终端用户控制交互式应用程序.