linux shell用expect实现在scp时自动输入密码
linux shell用expect自动输入密码
最近有东西需要部署到很多服务器上去,一个服务器一个服务器的部署实在是在麻烦了,就想着用脚本自动部署来着,想的是在一台服务器上放上部署包,scp拷贝过去,然后ssh执行那边的部署脚本,但是苦于密码不能自动输入,后面找到了一个方法用expect
按行读取文件
首先得把所有得服务器信息从配置文件中一行一行的读取出来
# list.txt 是存储服务器信息的文件
# deploy.sh 是部署的脚本
cat list.txt | while read LINE
do
./deploy.sh $LINE
done
expect
首先,你得下载这个命令
sudo apt-get install expect
详细的语法,可以看这位大佬的文章
有两种用法,一种是
#!/bin/bash
expect -c "
spawn scp ./test.txt root@192.168.100.22:/root
expect {
\"yes/no\" {send \"yes\r\";exp_continue;}
\"*password\" {set timeout 500;send \"123456\r\";}
}
expect eof"
第二种用法(其实实质还是一样的):
#!/bin/expect
spawn scp ./test.txt root@192.168.100.22:/root
expect {
"yes/no" {send "yes\r";exp_continue;}
"*password" {set timeout 500;send "123456\r";}
}
解释一下:
spawn
: 是开一个新的进程去执行后面的命令
expect
: 是获取spawn命令执行后的信息,看看是否和其事先指定的相匹配,如果匹配就会执行后面的内容。如果单独写expect不写spawn,就不会触发。
send
: 发送指定的字符给系统。
exp_continue
: 是让expect继续往下匹配。
eof
: 关键字用于匹配结束符。
其他
我有一个脚本initial.sh
是这样写的:
#!/bin/bash
read -p "Please Input: " num1
# ...
我也想要自动部署的时候,能够自动输入最开始我是这样的
yes "1" | tail -n 1 | ./initial.sh
yes
,可以一直输出yes
命令后的字符串,直到手动停止掉这个yes
进程,如果yes
后面不跟,就会默认输出y
,最后发现一个超级简单的办法
echo "1" | ./initial.sh
这样就可以达到目的。