shell中自动交互的方法

第一种:输入重定向Here Document

重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。

它的基本的形式如下:

command << delimiter
    document
delimiter

它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

注意:

  • 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。

  • 开始的delimiter前后的空格会被忽略掉。

#!/bin/bash

ftp -i -n 192.168.167.187 << EOF
user hzc 123456
pwd
cd test
pwd
close
bye
EOF
    测试可以发现,如上代码使用帐号名hzc,密码123456成功登陆了ftp服务器,并进入目录,打印出了pwd。

第二种:管道,echo + sleep + |

    交互信息的另一个自动输入方法,管道,通过echo + sleep + | 。

#!/bin/bash

(echo "curpassword"
sleep 1
echo "newpassword"
sleep 1
echo "newpassword")|passwd
即:执行passwd命令后,输入curpassword,1秒后输入newpassword,1秒后再次输入newpassword,达到把当前用户的curpassword改成newpassword。

第三种:expect命令

    expect就是一个专门用来实现自动交互功能的工具,expect的语法可以参考相关资料,代码如下:

#!/usr/bin/expect
spawn su root
expect "password: "
send "123456\r"
expect eof
exit

脚本命名为xx.exp

第四种:Here Document结合expect

expect <<!
这中间都是expect命令
!

例如:

expect<<!
    spawn sudo chown -R adminHard:adminHard $newdir
    expect {
    "*passwor*" {send "$COMPILE_SERVER_SSH_PASSWORD\n" ; exp_continue}
    }

!

注:expect命令

[set timeout 30]     
    基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒   
    
[spawn ssh -l username 192.168.1.1]    

spawn command命令会fork一个子进程去执行command命令,然后在此子进程中执行后面的命令;   

spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。    

    它主要的功能是给ssh运行进程加个壳,用来传递交互指令。   
   
[expect "password:"]   
    这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒   
   
[send "ispass\r"]   
    这里就是执行交互动作,与手工输入密码的动作等效。   
    温馨提示: 命令字符串结尾别忘记加上 “\r”,如果出现异常等待的状态可以核查一下。   
   
[interact]    

    执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行一段命令就退出,可改为[expect eof]

expect可以让你使用“-c”选项,直接在命令行中执行它,例如:

expect -c '
        spawn git pull
        expect {
        "Usernam*" {send "code_manager@ren001.com\n"; exp_continue }
        "Passwor*" {send "$GIT_CODE_PASSWORD\n" ; exp_continue}
        }
        '

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值