前几天在linux服务器上部署项目时需要把程序从测试服务器上拷贝过来,以前处理类似问题的逻辑都是先从源服务器上把文件下载到我的电脑里,然后再从我的电脑里上传到目标服务器。由于这次的程序比较大(1G左右),按照之前的操作会比较耗时,有没有一个从A服务器直接复制文件到B服务器的方法?
我从网上零零散散找了一些资料,用linux的scp命令可以解决以上问题,这里做一个汇总。还是老规矩,本文先讲怎么操作,然后讲各项参数的意义,最后讲注意事项。总之,跟着做就对了,有疑问就带着问题往下做,如果看完后还有问题可以在留言区提问
开始操作之前你首先得有两台linux服务器,并且保证两台服务器之间网络互通,可以使用ping测试一下网络互通情况。如果网络互通,那么就可以愉快的开始了,先登录到一台服务器上,我们称之为本地服务器,另一台服务器称之为远程服务器(假设远程服务器ip为192.168.101.1,用户名为root)
在本地服务器的/home目录下创建local.txt文件,然后把local.txt复制到远程服务器的根目录下,依次执行下面3个命令
cd /home
touch local.txt
scp /home/local.txt root@192.158.1.1:/local.txt
执行完后会提示你输入远程服务器的密码,如下,输入完后就复制成功了,快到远程服务器上的根目录下看一下是否有local.txt文件吧
现在我们要把刚才复制到远程服务器上的local.txt在复制回来,并重命名为local_copy.txt,执行如下命令
scp root@192.168.101.1:/local.txt /home/local_copy.txt
执行该命令后同样会提示你输入远程服务器的密码,输入完成后查看一下本地服务器的/home目录下是不是有一个local_copy.txt
命令详解
linux远程复制命令为scp,语法如下
//从本地复制到远程
scp [可选参数] local_file [remote_username@]remote_ip:remote_file
// 从远程复制到本地
scp [可选参数] [remote_username@]remote_ip:remote_file local_file
local_file表示本机文件,remote_file表示远程服务器文件
remote_username和 remote_ip分别表示远程服务器ip和用户名
可选参数
-1: 强制scp命令使用ssh1协议 -2: 强制scp命令使用ssh2协议 -4: 强制scp命令只使用IPv4寻址 -6: 强制scp命令只使用IPv6寻址 -B: 使用批处理模式(传输过程中不询问传输口令或短语) -C: 允许压缩(将-C标志传递给ssh,从而打开压缩功能) -p: 保留原文件的修改时间,访问时间和访问权限。 -q: 静默模式,不显示传输进度条。 -r: 递归复制整个目录,复制文件夹时必须带上此参数 -v: 详细方式显示输出。 -c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。 -F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。 -i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。 -l limit: 限定用户所能使用的带宽,以kb/s为单位。 -P port: 大写的P, port是指定数据传输用到的端口号 -S program: 指定加密传输时所使用的程序,此程序必须能够理解ssh1的选项。
注意事项
1. 两台服务器之间必须可以网络通信,否则不能完成复制。使用 ping 命令可以测试两台服务器是否互通
2. remote_username参数可选,不加这个参数默认使用的是root用户
3. 复制到目的地的同时可以重命名文件
// 将本地的local.txt文件复制到远程机并重命名为remote.txt
scp /home/local.txt root@192.168.101.1:/home/remote.txt
4. 复制文件夹时需要加上 -r 参数,否则会报错。
// 复制logs文件夹要加上-r参数
scp -r /home/logs root@192.168.101.1:/home/logs
5. 指定的目的地的目录必须存在,否则会报错。
// 如果/usr/logs目录不存在就会报错
scp -r /home/logs/catalina.out root@192.168.101.1:/usr/logs/catalina.out