Linux的服务器之间传文件的指令操作通常有两种,一种是sftp、ftp,另一种是scp,这两类指令,都可以实现文件的上传和下载。但是,如果不是写在脚本中,而是纯指令操作,sftp和ftp在登陆后才可以执行cd或者直接cp,因此,包括登陆在内,至少需要两次指令操作,而scp只需要一次操作即可完成文件的上传和下载。
scp的option介绍,可以参考man,
scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit]
[-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 ... [[user@]host2:]file2
option参数说明,
-1:强制scp命令使用协议ssh1 -2:强制scp命令使用协议ssh2 -4:强制scp命令只使用IPv4寻址 -6:强制scp命令只使用IPv6寻址 -B:使用批处理模式(传输过程中不询问传输口令或短语) -C:允许压缩。(将-C标志传递给ssh,从而打开压缩功能) -p:保留原文件的修改时间,访问时间和访问权限。 -q:不显示传输进度条。 -r:递归复制整个目录。 -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。 -c cipher:以cipher将数据传输进行加密,这个选项将直接传递给ssh。 -F ssh_config:指定一个替代的ssh配置文件,此参数直接传递给ssh。 -i identity_file:从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。 -l limit:限定用户所能使用的带宽,以Kbit/s为单位。 -o ssh_option:如果习惯于使用ssh_config(5)中的参数传递方式, -P port:注意是大写的P, port是指定数据传输用到的端口号 -S program:指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
scp缩写如下,
scp [可选参数] file_source file_target
通过一台机器,就可以模拟文件的上传和下载,为了演示方便,我在一台服务器上创建了两个目录,一个是local代表本地,一个是remote代表远程,local中有两个文件,1.txt和2.txt。
P.S. scp,不仅仅可以上传,还可以下载,这就是为什么上述缩写中是file_source源文件和file_target目标文件,而不是file_local本地文件,file_remote远程文件。
场景1,本地上传文件至远程服务器
(1) 将本地的1.txt上传至10.221.0.1用户oracle的路径/home/oracle/test/remote下,文件名称还是1.txt,
[test@app local]$ scp 1.txt oracle@10.221.0.1:/home/oracle/test/remote/
(2) 指令不带用户名,默认远程服务器用户名和当前执行指令的用户名相同,如下所示,默认文件上传至服务器10.221.0.1的用户test路径下,
[test@app local]$ scp 1.txt 10.221.0.1:/home/oracle/test/remote/
(3) 指定远程路径的文件名,则会对上传文件进行改名,如下所示,将本地的1.txt上传至远程服务器,文件名称改为a.txt,
[oracle@app local]$ scp 1.txt oracle@10.221.0.1:/home/oracle/test/remote/a.txt
[test@app local]$ scp 1.txt 10.221.0.1:/home/oracle/test/remote/a.txt
场景2,本地上传文件夹至远程服务器
此时可以使用-r选项递归复制文件夹,不改动文件夹的名称,
[oracle@app test]$ scp -r local oracle@10.221.0.1:/home/oracle/test/remote/
[oracle@app test]$ scp -r local 10.221.0.1:/home/oracle/test/remote/
改动文件夹的名称,
[oracle@app test]$ scp -r local oracle@10.221.0.1:/home/oracle/test/remote/test
[oracle@app test]$ scp -r local 10.221.0.1:/home/oracle/test/remote/test
场景3,从远程服务器下载文件/文件夹
(1) 下载文件,
[oracle@app local]$ scp oracle@10.221.0.1:/home/oracle/test/remote/1.txt 1.txt
[oracle@app local]$ scp 10.221.0.1:/home/oracle/test/remote/1.txt 1.txt
(2) 下载文件夹,
[oracle@app local]$ scp -r oracle@10.221.0.1:/home/oracle/test/remote/test test
[oracle@app local]$ scp -r 10.221.0.1:/home/oracle/test/remote/test test
场景4,本地上传多个文件至远程服务器
输入多个文件名,
[oracle@app local]$ scp 1.txt 2.txt oracle@10.221.0.1:/home/oracle/test/remote
[oracle@app local]$ scp 1.txt 2.txt 10.221.0.1:/home/oracle/test/remote
场景5,从远程服务器下载多个文件
学习一下场景4,可能会这么写,的确可以,但是对每个文件都需要输入一次用户名(当然设置ssh互信就会更简单),
[oracle@app local]$ scp oracle@10.221.0.1:/home/oracle/test/remote/1.txt oracle@10.221.0.1:/home/oracle/test/remote/2.txt .
oracle@10.221.0.1's password:
1.txt 100% 0 0.0KB/s 00:00
oracle@10.221.0.1's password:
2.txt 100% 0 0.0KB/s 00:00
还可以使用通配符的形式,但是特殊字符需要处理下,一次操作更简单,
[oracle@app local]$ scp oracle@10.221.0.1:/home/oracle/test/remote/\{1.txt,2.txt\} .
oracle@10.221.0.1's password:
1.txt 100% 0 0.0KB/s 00:00
2.txt 100% 0 0.0KB/s 00:00
参考,
https://blog.csdn.net/life_journey/article/details/100916011
https://www.runoob.com/linux/linux-comm-scp.html