使用scp上传文件到服务器或从服务器下载文件(支持跨越跳板机)
Table of Contents
scp是什么?
使用man scp
可以看到scp的解释『scp — secure copy (remote file copy program)』,scp是一个安全拷贝工具,支持远程拷贝,它支持本地拷贝到本地(当然这个一般不会用它,直接用cp
就行)、本地拷贝到远程(上传)、远程拷贝到本地(下载)、远程拷贝到远程。
scp是使用ssh通道来传输的,所以,linux服务器都是自带scp的,scp传输文件要输入密码的问题,可以通过设置ssh免密码登录即可解决。
实例演示
从本地拷贝到本地
从本地拷贝到本地一般人不会用它,因为没必要,直接用cp
就行,这里只是作为演示:
把文件file1.txt
拷贝到test2
目录,如果第一个参数是目录,则要加-r
(recursive,递归拷贝)
scp /path/to/file1.txt /path/to/test2/
本地拷贝到远程(上传文件到服务器)
使用格式
scp 本地文件 远程服务器用户名@远程服务器IP:远程服务器目录
把file1.txt
上传到远程服务器的/home/zhangsan
目录中,远程服务器用户名为zhangsan
,远程服务器ip为101.5.13.115
:
scp file1.txt [email protected]:/home/zhangsan
可以用~
表示家目录(~
待同于/home/zhangsan
):
scp file1.txt [email protected]:~
把file1.txt
上传到远程服务器的/home/zhangsan
目录中,并把上传后的文件重命名为testfile1.txt
:
scp file1.txt [email protected]:/home/zhangsan/testfile1.txt
把newdir
文件夹上传到远程服务器中(上传文件夹要加-r,注意-r的r是小写,r表示recursive,递归的意思)
scp -r newdir [email protected]:/home/zhangsan
指定服务器端口(scp默认端口为ssh的端口,即22,因为它的数据传输实际上是使用ssh的,其实跟安全有关的,都是用ssh的,比如sftp,它也是通过ssh来传的),注意端口使用-P指定,P是大写的,不是像ssh那样小写,在这里小写的P是preserve的意思,意思是保留文件原始信息(比如文件创建时间,文件修改时间,文件权限等等)。
scp -r -P 22 newdir [email protected]:/home/zhangsan
同时上传多个文件,一种方式是,把多个文件放到目录中,另一种是直接传多个文件(多个文件之间用空格隔开)
scp file1.txt file2.txt [email protected]:/home/zhangsan
使用正则表达式同时上传多个文件(用于文件名类似的文件)
scp file* [email protected]:/home/zhangsan
从远程拷贝到本地(从远程服务器下载文件)
其实很简单,只需要把从本地上传到远程服务器反过来即可,使用格式:
scp 远程服务器用户名@远程服务器IP:远程服务器文件绝对地址 本地文件
从远程服务器下载/home/zhangsan/file1.txt
文件到本地当前目录./
scp [email protected]:/home/zhangsan/file1.txt ./
从远程服务器下载/home/zhangsan/file1.txt
文件到本地当前目录./
,并把下载的文件重命名为testfile1.txt
:
scp [email protected]:/home/zhangsan/file1.txt ./testfile1.txt
从远程服务器下载文件夹,道理跟上传是一样的,只要加-r
参数即可。如下例:把远程服务器的/home/zhangsan/newdir
文件夹下载到当前目录中
scp -r [email protected]:/home/zhangsan/newdir ./
指定远程端口,跟上传一样,用-P
(P大写)
scp -P 2232 [email protected]:/home/zhangsan/file1.txt ./
从远程服务器下载多个文件到本地,除了可以把文件都放到一个目录里下载目录之外,还可以用引号(单/双都可以)把远程文件引起来,里面的多个文件用空格隔开,当然文件必须写绝对路径,如把远程服务器中的/home/xiebruce/file1.txt /home/xiebruce/file2.txt
两个文件下载到当前目录./
:
scp [email protected]:'/home/xiebruce/file1.txt /home/xiebruce/file2.txt' ./
使用正则从远程服务器下载多个文件到本地当前目录./
(注意用到了正则,一定要用引号括起来,否则报错):
scp [email protected]:'/home/xiebruce/file*' ./
远程拷贝到远程(两个远程服务器之间拷贝)
注意这里说的远程到远程,是指A、B是两台远程主机,我们可以通过scp
,在不登录A,也不登录B的情况下,直接在你自己的电脑中使用scp命令,实现A拷贝到B,当然你也可以登录其中一台,这样的话,你登录的那台机就相当于上面说的”本地”了。因此,我们必须让A服务器登录到B服务器时免密码登录,设置方法:Linux-使用ssh免密码登录
scp [email protected]:/home/xiebruce/file1.txt [email protected]:/home/xiebruce
以上命令实现的原理,是scp把命令上传到A机器,然后在A机器中执行命令把A机器中的指定文件拷贝到B机器,所以,所谓的远程到远程,其实实质上是『本地到远程』,因为真正的命令是在A机器上执行,所以A就相当于本地,B相当于远程。
使用ipv6报错问题
由于ipv6地址是使用冒号:
分隔的,而我们的scp在ip后面指定路径时,也是用冒号:
分隔,这就会造成混淆,所以我们要用方括号括住ipv6地址,并且要用冒号括住整个ip地址和文件路径。
具体写法如下
scp -r xiebruce@"[2700:1d13:5cd:1400:e1d2:2f98:6aec:b1c3]:/home/xiebruce/file1.txt" ./
scp穿越跳板机
由于scp本身就是通过ssh通道来传输的,所以scp穿越跳板机的方式,与ssh完全相同,什么是跳板机、ssh如何穿越跳板机可以看这篇文章:ssh通过代理登录远程主机及穿越跳板机。
命令指定跳板机
scp穿越跳板机格式:
scp -o "ProxyJump 跳板机用户名@跳板机ip(或域名)" 要传送的文件绝对路径 目标机用户名@目标机ip:目标机的文件夹
以下命令,表示使用scp,通过跳板机10.37.129.5
把本地文件/home/xiebruce/test.txt
传送到实际要传送的目标机10.37.129.6
的/home/xiebruce/
目录中:
scp -o "ProxyJump [email protected]" /home/xiebruce/test.txt [email protected]:/home/xiebruce/
以下命令,与上边的命令刚好反过来,表示使用scp,通过跳板机10.37.129.5
把远程服务器10.37.129.6
中的/home/xiebruce/test.txt
文件下载到本地的当前目录./
中:
scp -o "ProxyJump [email protected]" [email protected]:/home/xiebruce/test.txt ./
配置文件指定跳板机
具体先去看看ssh通过代理登录远程主机及穿越跳板机中的配置文件指定方法,scp与ssh完全一样的。
在~/.ssh/config
中添加以下语句(当然用户名和ip都要改成你的):
# 定义跳板机
Host jump
HostName 10.37.129.5
User xiebruce
Port 22
# 定义目标机
Host 10.37.129.6
HostName 10.37.129.6
# 表示通过jump这个跳板机来传送
ProxyJump jump
以下命令,是把本地的/home/xiebruce/test.txt
文件通过跳板机10.37.129.5
传到远程的10.37.129.6
服务器中的/home/xiebruce/
目录中:
scp /home/xiebruce/test.txt [email protected]:/home/xiebruce/
但是在命令里看不出使用了跳板机,那是因为在ssh的配置文件~/.ssh/config
中定义了通过跳板机传送的配置。
反过来,把服务器的文件下载下来,也是一样的:
scp [email protected]:/home/xiebruce/test.txt ./
与前面的方法一样,你还可以用-P
指定端口(当然这个端口是指A机器的端口),用-r
指定拷贝目录,以及拷贝多个文件都可以用前面的方法。
免密码穿越跳板机
与ssh一样,只要满足“本地对跳板机ssh免密”及“本地对目标机ssh免密”,那么scp通过跳板机传送文件就能免密,而跳板机对目标机是不要求免密的。ssh免密配置方法请看:Linux-使用ssh免密码登录。
this is the best one!
I’m flattered.