Shell脚本实现⾃动输⼊密码登录服务器
使⽤Linux的程序员对输⼊密码这个举动⼀定不陌⽣,在Linux下对⽤户有严格的权限限制,⼲很多事情越过了权限就得输⼊密码,⽐如使⽤超级⽤户执⾏命令,⼜⽐如ftp、ssh连接远程主机等等,如下图:
那么问题来了,在脚本⾃动化执⾏的时候需要输⼊密码怎么办?⽐如你的脚本⾥有⼀条scp语句,总不能在脚本执⾏到这⼀句时⼿动输⼊密码吧。
针对于ssh或scp命令,可能有⼈会回答是建⽴信任关系,关于建⽴ssh信任关系的⽅法请⾃⾏百度Google,只需要两⾏简单的命令即可搞定,但这并不是常规的解决⽅案,如果是ftp连接就没辙了,况且,你不可能为了执⾏某些命令去给每个你要连接的主机都⼿动建⽴ssh信任,这已经偏离了今天主题的本意,今天要说的是在脚本⾥⾃动输⼊密码,我们可以想象下,更优雅的⽅式应该是在脚本⾥⾃⼰配置密码,当屏幕交互需要输⼊时⾃动输⼊进去,要达到这样的效果就需要⽤到expect。
安装
CentOS下安装命令很简单,如下
复制代码代码如下:
sudo yum install expect
⾄于Mac⽤户,可以通过homebrew安装(需要先安装homebrew,请⾃⾏Google)
复制代码代码如下:
brew install expect
测试脚本
我们写⼀个简单的脚本实现scp拷贝⽂件,在脚本⾥配置密码,保存为p如下
复制代码代码如下:
#!/usr/bin/expect
set timeout 20
if { [llength $argv] < 2} {
puts "Usage:"
puts "$argv0 local_file remote_path"
exit 1
}
set local_file [lindex $argv 0]
set remote_path [lindex $argv 1]
set passwd your_passwd
set passwderror 0
spawn scp $local_file $remote_path
expect {
"*assword:*" {
if { $passwderror == 1 } {
puts "passwd is error"
exit 2
}
set timeout 1000
set passwderror 1
send "$passwd\r"
exp_continue
}
"*es/no)?*" {
send "yes\r"
exp_continue
}
shell代码
timeout {
puts "connect is timeout"
exit 3
}
}
注意,第⼀⾏很重要,通常我们的脚本⾥第⼀⾏是#!/bin/bash,⽽这⾥是你机器上expect程序的路径,说明这段脚本是由expect来解释执⾏的,⽽不是由bash解释执⾏,所以代码的语法和shell脚本也是不⼀样的,其中set passwd your_passwd设置成你⾃⼰的密码,然后执⾏如下命令
复制代码代码如下:
./p ./local_file user@host:/xx/yy/
执⾏前确保p有执⾏权限,第⼀个参数为你本地⽂件,第⼆个为远程主机的⽬录,运⾏脚本如果报错“connect is timeout”,可以把超时设长⼀点,第⼆⾏set timeout 20可以设置超时时间,单位是秒。脚本执⾏效果如下
还能做什么
细⼼的同学⼀定发现了,其实expect提供的是和终端的⼀种交互机制,输⼊密码只是其中⼀种应⽤形式,只要是在终端阻塞需要输⼊时,都可以通过expect脚本完成⾃动输⼊,⽐如前⾯脚本⾥配置了两种交互场景,⼀种是终端提⽰"password:"时输⼊密码,还有⼀种是提⽰"yes/no)?"时输⼊“yes”,如果和远程主机是第⼀次建⽴连接,执⾏p脚本效果是这样的
所以我们可以根据终端的提⽰来配置输⼊命令,这样就能达到了⾃动化的效果。⾄于处理其它交互场景,只需要照着上⾯的脚本依葫芦画瓢就⾏了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。