用expect、scp发布版本到远程服务器

背景

两台linux主机
A:本地主机,IP:192.168.1.81
B:服务主机,IP:192.168.1.91

要满足需求

  • 从A上传文件到B
  • 全程脚本实现,不能人工输入

制作SSH证书

在A主机制作证书,-P参数是密码,注意这里我的用户是root,这里的密码是证书密码,如果你的脚本要运行在jenkins里,而又没有为jenkins创建用户目录,后续的脚本写法就会有问题并且还暴露root密码,最好的做法是在jenkins用户下创建证书
[root@centos]# ssh-keygen -t rsa -P 'mypassword'

把A的证书,推送到B上
[root@centos]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.1.91

测试登录,输入制作证书时的密码“mypassword”,没设密码直接回车
[root@centos]# ssh 192.168.1.91

如果登录成功,则当前执行的指令都是B主机上,所以要退出回到A
[root@centos]# exit

安装 expect

expect主要是可以根据反馈来做出不同判断,从而自动输入密码
yum install expect

自动上传bash脚本

这个脚本是运行在jenkins里的,但是没有为jenkins创建用户目录,证书也是以root的账户制作的,所以就必须要暴露root密码了

#!/bin/sh

src_dir=/home/android_debug/apk #本地文件目录
[email protected]:/home/uploadapp/  #服务器目录
root_password=rootpassword #root账号密码
ssh_password=mypassword #证书密码

upload2server()
{
   if [ $# -eq "3" ];then #如果参数个数等于3
    src=$1
    dest=$2
    pwd=$3

    #expect做反馈和控制,-d参数是输出调试信息
    /usr/bin/expect -d<<-EOF 
    set timeout -1
    spawn su - root #切换到root用户的环境
    expect {
    "*password*" { send "${pwd}\r";}
    "*密码*" { send "${pwd}\r";}
    }
    send "scp ${src} ${dest}\r" #上传文件
    expect {
    "*passphrase*" { send "${ssh1_password}\r";}
    }
    
    expect 100% 
    #这个地方很重要,如果匹配到100%代表上传成功
    #这时候要发退出root环境,否则会一直等待到超时
    
    send "logout\r"
        
    expect eof
    exit 0
    EOF

   fi
}

mv ${src_dir}/*.apk ${src_dir}/publish.apk 

upload2server ${src_dir}/publish.apk  ${target_dir} ${ssh_password}

你可能感兴趣的:(用expect、scp发布版本到远程服务器)