Linux命令传输文件scp

224 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

背景需求

当前需要做服务器迁移,从阿里云到本地部署<dev-test>,项目使用nexus搭建maven管理仓库,原先都是在阿里云服务器管理,
所以在哪里访问都无所谓,外网均可访问使用;那么现在部署maven仓库到了本地,如何实现在阿里云服务器构建访问呢?
使用场景是这样的:原来不管去哪里部署,都是先构建git,拉取最新代码打包,然后再部署应用,且耗时较长;
现在想是上线部署的jar包是经过我们测试通过,再上传到服务器的jar包;部署时从服务器获取jar包再部署。

需要解决的问题

测试通过的jar包通过哪种方式上传到哪里?
部署时,又以何种方式去获取jar包部署?

多种解决方案

  • ftp服务器:将jar包通过ftp上传到服务器,然后再上ftp服务器获取jar包部署;
  • scp远程上传指令,将本地jar包,远程上传到存放jar包的服务器,然后再....
  • git仓库托管,本地push到仓库,部署时clone下来,然后再....
  • 独立ip开放端口,这样一来就是原部署方式不变,统一jenkins调度毋须修改。

选择解决办法

1、ftp需要在中转服务器搭建服务器,连接服务器的主机需要安装客户端;比较繁琐;
2、scp要是远程可以通过公钥密钥的方式免密传输,本地到远程,可能需要输入密码;
3、git仓库要是存在多个服务的时候,不便于管理,不知是多个服务多个git还是???
4、独立ip设置开放端口,比较省事的做法,原来上线部署方式不用改变。

scp免密传输文件到远程服务器

难点:在linux客户端A传输文件到linux客户端B,scp需要附带输入密码;很不方便!
思路:在A生成rsa密钥,将.pub公钥内容追加只B的~/.ssh/authorized_keys就可以了
  • 生成主机的本地认证密钥:ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa >/dev/null 2>&1
  • 将本机的pub密钥拷贝到其他主机的authorized_keys文件中:ssh-copy-id -i ~/.ssh/id_rsa.pub "root@192.168.2.120"
    • 会需要输入其他主机的登录密码,建立信任关系
  • scp本地文件自动传输到远程服务器
#!/usr/bin/expect
set DATE [exec date +%Y%m%d%k]
set password ssss
set filename [lindex $argv 0]
set serverip 47.21.115.120
spawn scp $filename root@$serverip:/opt
set timeout 300
expect "root@$serverip's password:"
set timeout 300
send "$password\r"
set timeout 300
send "exit\r"
expect eof

  • scp从远程服务器传输文件到本地
#!/usr/bin/expect
set DATE [exec date +%Y%m%d%k]
set password ssss
#set filename [lindex $argv 0]
set serverip 47.21.115.120
spawn scp  root@$serverip:/opt/test.txt /opt
set timeout 300
expect "root@$serverip's password:"
set timeout 300
send "$password\r"
set timeout 300
send "exit\r"
expect eof

小结

在linux系统中,减少搭建ftp服务器的学历和运维成本,scp无疑是最佳的解决方案。