第一种:输入重定向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测试可以发现,如上代码使用帐号名hzc,密码123456成功登陆了ftp服务器,并进入目录,打印出了pwd。
ftp -i -n 192.168.167.187 << EOF
user hzc 123456
pwd
cd test
pwd
close
bye
EOF
第二种:管道,echo + sleep + |
交互信息的另一个自动输入方法,管道,通过echo + sleep + | 。
#!/bin/bash即:执行passwd命令后,输入curpassword,1秒后输入newpassword,1秒后再次输入newpassword,达到把当前用户的curpassword改成newpassword。
(echo "curpassword"
sleep 1
echo "newpassword"
sleep 1
echo "newpassword")|passwd
第三种: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}
}
'