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

这样就可以达到目的。


版权声明:本文为qq_44723937原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。