linux shell用expect实现在scp时自动输入密码
原文链接:https://blog.csdn.net/qq_44723937/article/details/122096717
linux shell用expect自动输入密码
最近有东西需要部署到很多服务器上去,一个服务器一个服务器的部署实在是在麻烦了,就想着用脚本自动部署来着,想的是在一台服务器上放上部署包,scp拷贝过去,然后ssh执行那边的部署脚本,但是苦于密码不能自动输入,后面找到了一个方法用expect
按行读取文件
首先得把所有得服务器信息从配置文件中一行一行的读取出来
# list.txt 是存储服务器信息的文件
# deploy.sh 是部署的脚本
cat list.txt | while read LINE
do
./deploy.sh $LINE
done
1
2
3
4
5
6
7
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"
1
2
3
4
5
6
7
8
9
第二种用法(其实实质还是一样的):
#!/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";}
}
1
2
3
4
5
6
7
8
解释一下:
spawn: 是开一个新的进程去执行后面的命令
expect: 是获取spawn命令执行后的信息,看看是否和其事先指定的相匹配,如果匹配就会执行后面的内容。如果单独写expect不写spawn,就不会触发。
send: 发送指定的字符给系统。
exp_continue: 是让expect继续往下匹配。
eof: 关键字用于匹配结束符。
其他
我有一个脚本initial.sh是这样写的:
#!/bin/bash
read -p "Please Input: " num1
# ...
1
2
3
4
我也想要自动部署的时候,能够自动输入最开始我是这样的
yes "1" | tail -n 1 | ./initial.sh
1
yes,可以一直输出yes命令后的字符串,直到手动停止掉这个yes进程,如果yes后面不跟,就会默认输出y
,最后发现一个超级简单的办法
echo "1" | ./initial.sh
1
这样就可以达到目的。
以下操作才会对同名文件覆盖
scp -r /usr/local/soft/spark-2.1.0-bin-without-hadoop root@192.168.0.12:/usr/local/soft/