1. linux shell脚本嵌入一段expect
expect2确实是在linux自动运维的好东西, 好好利用了啊
不懂expect如何使用, 就一起研究一下?
2. linux shell 嵌入expect 我这个写的那里有问题
#!/bin/bash
date=`date +%Y%m%d`
pw='123456'
/usr/bin/expect -c "
spawn mysqlmp -u root -p ec > ec$date.sql ;
set timeout 10;
expect {
\"*password*\" {send \"$pw\r\";}
}
expect eof;"
3. Linux expect 详解
首先检查系统是否自带了expect程序, 一般在 系统的/usr/bin目录下, 如果没有自带expect, 那么需要自行安装expect. 这里仅介绍ubuntu和redhat系列linux的安装方法。
ubuntu系列
redhat系列
说明:
Expect—网络篇命令
expect(1) - Linux man page
4. linux shell 脚本 和 tcn expec 混合的问题
一、 行 1 和 行 2 怎么共同起作用? 实际效果是只有第一行起作用
不可能同时起作用,总是第一行的起作用,一个脚本只能是一种语言,要么是 shell, 要么是 expect,要么是其他某种。 你可以把 expect 脚本另外写入一个文件中,然后在 shell 脚本中调用 expect 脚本。
二、 行 7 如何 改成 if 条件判断 ?因为有时候登录只在第一次时出现特殊问题(如协议)确认
改成
expect {
"(yes/no)?" {send "yes\r"; continue}
"password" {send "AAAA\r"}
}
.....
即可。 建议你先去学一些 shell 脚本的基础知识,tcl/expect的基础知识再说。
5. linux shell expect怎么scp
set password 密码
spawn scp 用户名@目标机器ip:拷贝文件的路径 存放本地文件的路径
set timeout 300
expect "用户名@目标机器ip's password:" //注意:这里的“用户名@目标机器ip” 跟上面的一致
set timeout 300
send "$password\r"
set timeout 300 //此处设置超时时间,单位为秒,如果,拷贝文件比较大并且多时,应该将这个值调大一些。
6. linux shell expect脚本通过脚本调用与传参调用结果为什么不一样
理论不明,有个试一下的建议,不论成功与否,希望楼主反馈一下.
你符值时用用单引号试一下.
command ="'参数1' '参数2' '参数3'"
7. 如何在linux下shell编写脚本中模拟键盘输入
用 yes 命令
如 yes 123 可以不停的输出 123,你可以用 yes 123 | head -3 输出三次。
然后你要是要对某个程序做输入,你用输入重定向。
如果你说的是应答,那就用 expect,具体的用法就复杂了,自己搜教程系统地学习吧。
8. expect脚本在Linux下是如何使用的
如果你是expect脚本语言的新手,可以首先从我们的expect的“hello world”样例(英文)开始。
1,使用“-c”选项,从命令行执行expect脚本
expect可以让你使用“-c”选项,直接在命令行中执行它,如下所示:
$ expect -c 'expect "\n" {send "pressed enter\n"}
pressed enter
$
如果你执行了上面的脚本,它会等待输入换行符(\n)。按“enter”键以后,它会打印出“pressed enter”这个消息,然后退出。
2,使用“-i”选项交互地执行expect脚本
使用“-i”选项,可以通过来自于标准输入的读命令来交互地执行expect脚本。如下所示:
$ expect -i arg1 arg2 arg3
expect1.1>set argv
arg1 arg2 arg3
expect1.2>
正常情况下,当你执行上面的expect命令的时候(没有“-i”选项),它会把arg1当成脚本的文件名,所以“-i”选项可以让脚本把多个参数当成一个连续的列表。
当你执行带有“-c”选项的expect脚本的时候,这个选项是十分有用的。因为默认情况下,expect是交互地执行的。
3,当执行expect脚本的时候,输出调试信息
当你用“-d”选项执行代码的时候,你可以输出诊断的信息。如下所示:
$ cat sample.exp
# !/usr/bin/expect -f
expect "\n";
send "pressed enter";
$ expect -d sample.exp
expect version 5.43.0
argv[0] = expect argv[1] = -d argv[2] = sample.exp
set argc 0
set argv0 "sample.exp"
set argv ""
executing commands from command file sample.exp
expect: does "" (spawn_id exp0) match glob pattern "\n"? no
expect: does "\n" (spawn_id exp0) match glob pattern "\n"? yes
expect: set expect_out(0,string) "\n"
expect: set expect_out(spawn_id) "exp0"
expect: set expect_out(buffer) "\n"
send: sending "pressed enter" to { exp0 pressed enter}
4,使用“-D”选项启动expect调试器
“-D”选项用于启动调试器,它只接受一个布尔值的参数。这个参数表示提示器必须马上启动,还是只是初始化调试器,以后再使用它。
$ expect -D 1 script
“-D”选项左边的选项会在调试器启动以前被处理。然后,在调试器启动以后,剩下的命令才会被执行。
$ expect -c 'set timeout 10' -D 1 -c 'set a 1'
1: set a 1
dbg1.0>
5,逐行地执行expect脚本
通常,expect会在执行脚本之前,把整个脚本都读入到内存中。“-b”选项可以让expect一次只读取脚本中的一行。当你没有写完整个脚本的时候,这是十分有用的,expect可以开始执行这个不完整的脚本,并且,它可以避免把脚本写入到临时文件中。
$ expect -b
6,让expect不解释命令行参数
你可以使用标识符让expect不解释命令行参数。
你可以像下面这样的读入命令行参数:
$ cat print_cmdline_args.exp
#!/usr/bin/expect
puts 'argv0 : [lindex $argv 0]';
puts 'argv1 : [lindex $argv 1]';
当执行上面的脚本的时候,会跳过命令行选项,它们会被当成参数(而不是expect选项),如下所示:
$ expect print_cmdline_args.exp -d -c
argv0 : -d
argv1 : -c
9. Linux 编写shell,我想启动这个shell,来调取一个配置文件(这个文件里面写有另一个ip
这个功能,可以用expect来实现。你网上搜下关于expect语言的例子,具体实现应该也不难。
(还有,一个办法,但是局限性很大,这个办法是,通过在A服务器生成密钥,加入到另一个ip的B服务器,实现这个A服务器登陆B服务器,不需要密钥)
10. 用expect实现telnet登陆到linux系统后,再执行一个shell脚本,待这个shell脚
参考一种类自然语言的脚本语言:
001 var {v_time} value datetime
002 screen.text at point {10} {30} string {2. telnet ipv4 (192.168.186.132:23) test , datetime: ~v_time~}
003
004 telnet.connect ip {192.168.186.132} port {23}
005 telnet.recv expect {Username:}
006 telnet.send {cisco%0a}
007 telnet.recv expect {Password}
008
009 telnet.send {cisco%0a}
010 telnet.recv expect {>}
011 telnet.send {enable%0a}
012 telnet.set onrecv {More} send { }
013 telnet.set delay {200} ms after per byte send
014 telnet.send {show version%0a}
015 telnet.recv for {5} seconds
016
017 telnet.send {show run%0a}
018 telnet.recv for {5} seconds
019 telnet.send {exit%0a}
020 telnet.close
021
022 var {v_time} value datetime
023 screen.text at point {10} {60} string {telnet tested end. datetime:~v_time~}
024
025 run.end
--------------------------------------------------------------------
简单网络管理语言(Simple Network Management Language)是一种类自然语言的脚本语言,它采用snmp、telnet、ping、dns、arp、ssh、tcp、udp、web等协议访问网络设备,内置smtp协议用于告警等邮件的发送,支持excel、mysql、sqlite等3种方式进行网管数据的存取。
最新版本: snml8.13(ladybird20200205) utf8&ipv6
项目托管地址:https://github.com/ladybirdSnml/snmlipv6utf8snmptelnetsshweb
打包下载:https://ladybirdsnml.github.io/snmlipv6utf8snmptelnetsshweb/snml_utf8ipv6.zip