当前位置:首页 » 编程软件 » expect脚本变量

expect脚本变量

发布时间: 2022-11-08 07:31:45

⑴ 请问各位大神,如何在shell中调用expect脚本,并将刚刚在shell中处理后的结果传给expect

使用变量保存处理结果,然后在调用expect
#!/bin/sh
expect <<!
spawn ssh xx@yyy
expect "*Password*"
send "xxx\r"
expect ">"
send "mkdir xxxxx\r"
send "exit\r"
expect eof
!

linux远程重启windows

安装步骤:

1、进入链接下载最新 OpenSSH-Win64.zip(64位系统),解压至C:Program FilesOpenSSH

2、打开cmd,cd进入C:Program FilesOpenSSH(安装目录),执行命令:

powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1

3、设置服务自动启动并启动服务:

sc config sshd start= auto

net start sshd

到此服务已经安装完毕,默认端口一样是22,默认用户名密码为Window账户名和密码,当然防火墙还是要设置对应端口允许通讯

修改设置:

通常linux下会修改ssh_config文件来修改ssh配置,但在安装目录并没有发现这个文件,查阅官方wiki后发现,原来是在C:ProgramDatassh目录下(此目录为隐藏目录)

端口号:Port 22

密钥访问:PubkeyAuthentication yes

密码访问:PasswordAuthentication no

空密码:PermitEmptyPasswords no

然后进入C:Users账户名.ssh目录,创建authorized_keys公钥文件(也可在ssh_config修改路径)(仅限7.7之前版本,7.9版本请看最后更新)

设置完成后重启sshd服务,接下来就可以使用Xshell等工具使用密钥连接了~

踩过的坑:

命令行不识别空格时:C:Program Files用C:Progra~1替代

Windows Service2012R2即使配置了.ssh/authorized_keys公钥,连接时依然显示没有注册公钥。。。

查阅了官方wiki判断可能是权限问题:Fix SSH file permissions

进入C:Program FilesOpenSSH(安装目录),右键 FixHostFilePermissions.ps1【使用PowerShell运行】,命令行提示全选是,重启sshd服务后密钥连接正常

2019.5.17更新:

新部署服务器的时候,发现公钥无法注册,发现新版本有变动:

执行的命令为:

  • ./deploy/startwin 10.24.196.213 administrator Test1127?!

  • ⑶ Linux expect

    expect:expect是Unix系统中用来进行自动化控制和测试的脚本工具,常用于实现交互式任务的自动化。使用命令”dnf install expect -y”进行安装。脚本文件声明为”#!/usr/bin/expect”。

    expect常用命令如下:

    1.spawn+交互命令(如spawn ssh [email protected]):”spawn”是expect的初始命令,用于启动一个新的交互进程,之后所有的操作都会在这个进程中进行。

    2.set:定义变量/为变量赋值。使用语法:set 变量名 值。

    3.puts:将变量值/字符串定向到本地标准输出文件(即定位到屏幕)。使用语法:puts “字符串/$变量名”

    4.send_user:作用和使用方法类似于”puts”,区别在于”puts”会在输出内容的结尾自动追加一个换行符,而”send_user”不会。

    5.send:向交互进程发送信息/命令(字符串和一些特殊符号,\r—回车,\n—换行,\t—制表符)。使用语法:send “信息/命令[\r]”。

    6.[lindex $argv 数字]:表示外部传递参数的值,数字是n,就表示第n-1个参数。注:$argc表示外部传递参数的个数,也是一个值。

    7.expect+字符串+{ 命令 }:将字符串与交换进程接收到的信息进行匹配。如果匹配成功(字符串是交换进程接收到的信息的一部分),执行包含在”{}”中的命令;如果匹配失败,不执行包含在”{}”中的命令。该命令有三种使用方法:

    第一种:单分支模式

    ①expect 字符串 { 命令 }

    解释:如果字符串与交换进程接收到的信息匹配成功,执行包含在”{}”中的命令,并结束该expect命令;如果字符串与交换进程接收到的信息匹配失败,timeout秒后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

    ②expect {

    字符串{ 命令 }

    timeout { 命令 }

    }

    解释:如果字符串与交换进程接收到的信息匹配成功,执行包含在”{}”中的命令,并结束该expect命令;如果字符串与交换进程接收到的信息匹配失败,timeout秒后执行包含在”{}”中的命令,之后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

    第二种:多分支模式

    ①expect {

    字符串1 { 命令 }

    字符串2 { 命令 }

    }

    解释:如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并结束该expect命令;如果字符串1与交换进程接收到的信息匹配失败、字符串2与交换进程接收到的信息匹配成功,执行包含在”{}”中的命令,并结束该expect命令;如果字符串1、字符串2皆与交换进程接收到的信息匹配失败,timeout秒后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

    ②expect {

    字符串1 { 命令 }

    字符串2 { 命令 }

    timeout { 命令 }

    }

    解释:如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并结束该expect命令;如果字符串1与交换进程接收到的信息匹配失败、字符串2与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并结束该expect命令;如果字符串1、字符串2皆与交换进程接收到的信息匹配失败,timeout秒后执行包含在”{}”中的命令,之后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

    第三种:循环多分支模式(注:exp_continue命令只能出现在expect命令的匹配语句中,执行到exp_continue命令时,脚本会跳出当前expect命令,并重新执行该expect命令,直到expect命令通过不包含exp_continue命令的匹配语句结束、或expect命令匹配超时结束。)

    ①expect {

    字符串1 { 命令; exp_continue }

    字符串2 { 命令 }

    }

    解释:如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并重新执行该expect命令;如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并重新执行该expect命令...;如果字符串1与交换进程接收到的信息匹配失败、字符串2与交换进程接收到的信息匹配成功,执行包含在”{}”中的命令,并结束该expect命令;如果字符串1、字符串2皆与交换进程接收到的信息匹配失败,timeout秒后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

    ②expect {

    字符串1 { 命令; exp_continue }

    字符串2 { 命令 }

    timeout { 命令 }

    }

    解释:如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并重新执行该expect命令;如果字符串1与交换进程接收到的信息匹配成功,执行执行包含在”{}”中的命令,并重新执行该expect命令...;如果字符串1与交换进程接收到的信息匹配失败、字符串2与交换进程接收到的信息匹配成功,执行包含在”{}”中的命令,并结束该expect命令;如果字符串1、字符串2皆与交换进程接收到的信息匹配失败,timeout秒后执行包含在”{}”中的命令,之后结束该expect命令。(注:脚本执行到expect命令时,计时器就开始计时,并会在计时器超时前不断对交换进程接收到的信息进行扫描,尝试字符串与信息的匹配。)

    8.timeout:timeout是expect中的一个关键字变量,用于控制expect命令的超时时间。需要注意的是,这个超时时间针对于整个expect命令,而不是针对于expect命令中的某条匹配语句。也就是说,只有expect命令中所有匹配语句都匹配失败后,才会开始计算超时时间。timeout变量值缺省为10(秒),我们可以通过”set timeout=值”的方式为其重新赋值,作用范围:本次赋值到下一次赋值间的所有expect命令。注:如果需要为timeout变量重新赋值,应在expect命令之外进行。

    9.expect eof:该命令的作用是结束spawn交互进程,将命令行切回至运行脚本的主机(即从远端服务器登出)。

    10.interact:缺省情况下,expect脚本执行完毕后会自动从远端服务器登出(即便没有显式地执行”expect eof”命令)。使用interact命令后,expect脚本执行完毕会继续保持当前状态,并将控制权移交给用户。

    11.exit:结束该脚本。

    expect中的if语句:

    if { 条件表达式 } {

    命令

    }

    if { 条件表达式 } {

    命令

    } else {

    命令

    }

    expect中的while语句:

    while { 条件表达式 } {

    命令

    }

    expect中的for语句:

    for { set i 1 } { $i <=10 } { incr i } {

    命令

    }

    incr变量名 步长   ——变量自增

    incr 变量名 -步长    ——变量自减

    数学运算需使用let、expr等工具

    ⑷ linux系统sftp结合expect使用时,写脚本遇到参数问题

    您好,你的脚本设置filename变量语法不对,filename="xxxx"这是shell的语法。
    expect应该如下设置变量,变量和值之间是空格分隔,不是"="符号:
    set <var> <value>

    ⑸ shell脚本expect自动登录后,怎么又自动退出了

    1.安装expect
    需要先安装tcl:apt-get install tcl
    apt-get install expect
    2.expect使用
    2.1一个简单的输入密码操作
    #!/usr/bin/expect
    set timeout 100
    set password "123456"
    spawn sudo rm -rf zzlogic
    expect "root123456"
    send "$password\n"
    interact
    说明:
    第一行#!/usr/bin/expect表示使用expect的shell交互模式
    set是对变量password赋值
    set timeout 100:设置超时时间为100秒,如果要执行的shell命令很长可以设置超时时间长一些。expect超过超时时间没有监测到要找的字符串,则不执行,默认timeout为10秒
    spawn在expect下执行shell脚本
    expect对通过spawn执行的shell脚本的返回进行判断,是否包含“”中的字段
    send:如果expect监测到了包含的字符串,将输入send中的内容,\n相当于回车
    interact:退出expect返回终端,可以继续输入,否则将一直在expect不能退出到终端
    2.2expect的命令行参数
    [lindex $argv n]获得index为n的参数(index从0开始计算)
    $argc为命令行参数的个数
    [lrange $argv 0 0]表示第一个参数
    [lrange $argv 0 3]表示第1到第3个参数
    例如scp_service.sh文件,可以./scp_service.sh -rm来执行,这时是赋值了一个参数
    set option [lindex $argv 0](获得第一个参数存到变量option中,参数是的index是从0开始计算的)
    2.3if...elif...else...
    expect支持if语句,
    if {条件1} {
    条件1执行语句
    } elif {条件2} {
    条件2执行语句
    } else {
    其他情况执行语句
    }
    说明:
    1.if的条件用{}来包含条件
    2.if和后面的{}必须有空格隔开
    3.两个花括号之间必须有空格隔开,比如if {} {},否则会报错 expect:extra characters after close-brace
    3.使用{来衔接下一行,所以if的条件后需要加左花括号{
    4.else不能单独放一行,所以else要跟在}后面
    2.4 expect {},多行期望,匹配到哪条执行哪条
    背景:有时执行shell后预期结果是不固定的,有可能是询问是yes/no,有可能是去输入密码,所以可以用expect{}
    花括号内放多行语句,从上至下匹配,匹配到哪个expect执行哪句。
    3.shell中调用expect来实现登录
    我是通过在shell脚本中执行expect脚本的方式来实现的。当然可以将shell中定义的一些变量传递给expect脚本作为参数输入。

    ⑹ 在shell(#!/bin/sh)脚本中怎么使用expect命令,需要添加什么环境变量吗,正确即给分

    首先你在命令行执行env expect,看expect能不能用,如果不能用,那么你需要找到expect执行文件路径,加入到PATH环境变量中去。

    然后就可以在shell中使用了,有两种方式实现:
    1.用here document
    2.用expect -c

    $cat 1.sh
    #!/bin/sh
    output=`expect <<EXP
    puts "hello world"
    EXP
    `
    echo "expect 1 output:"
    echo $output
    echo
    echo "expect 2 output:"
    expect -c 'puts "hello world!"'

    $chmod 777 1.sh

    $./1.sh
    expect 1 output:
    hello world

    expect 2 output:
    hello world!

    ⑺ 如何向expect脚本里面传递参数

    向expect脚本里面传递参数:
    比如下面脚本用来做ssh无密码登陆,自动输入确认yes和密码信息,用户名,密码,hostname通过参数来传递

    ssh.exp

    Python代码
    #!/usr/bin/expect
    set timeout 10
    set username [lindex $argv 0]
    set password [lindex $argv 1]
    set hostname [lindex $argv 2]
    spawn ssh--id -i .ssh/id_rsa.pub $username@$hostname
    expect "yes/no"
    send "yes\r"
    expect "password:"
    send "$password\r"

    expect eof

    执行脚本./ssh.exp root pasword hostname1

    expect接收参数的方式和bash脚本的方式不太一样,bash是通过$0 ... $n 这种方式,而expect是通过set <变量名称> [lindex $argv <param index>],例如set username [lindex $argv 0]

    热点内容
    php开发的网页 发布:2025-05-14 16:22:03 浏览:477
    服务器内存跑满了怎么回事 发布:2025-05-14 16:21:16 浏览:223
    微信qq音乐缓存 发布:2025-05-14 16:16:16 浏览:468
    c语言回收内存 发布:2025-05-14 16:16:08 浏览:143
    2021国产安卓顶级旗舰买哪个 发布:2025-05-14 16:15:36 浏览:300
    linux自学视频 发布:2025-05-14 16:14:49 浏览:255
    我的世界服务器崩了重启 发布:2025-05-14 16:09:37 浏览:44
    android深拷贝 发布:2025-05-14 16:09:35 浏览:153
    cf电脑版转服务器神器还在吗 发布:2025-05-14 16:09:02 浏览:211
    百度文库服务器如何搭建 发布:2025-05-14 16:09:00 浏览:248