linux-command-01 scp

linux-command-01 scp

概念解析

安全复制协议

  安全复制(英语:Secure copy,缩写SCP)是指在本地主机与远程主机或者两台远程主机之间基于Secure Shell(SSH)协议安全地传输计算机文件。“SCP”通常指安全复制协议或者程序本身。SCP是一种基于BSDRCP协议的网络传输协议,支持同一个网络上主机之间传输文件。SCP使用Secure Shell(SSH)完成数据传输,并使用同时用它进行身份认证,从而确保数据传输时的真实性和保密性。客户端可以向服务器发送(上传)文件,可选包含其基本属性(权限、时间戳)。客户端也可以请求(下载)一个服务器的文件或目录。SCP默认通过TCP端口22运行。

Linux scp命令

  Linux scp命令用于Linux之间复制文件和目录。scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。

语法

完整写法

1
2
3
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] 
[-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2

简易写法

1
scp [可选参数] file_source file_target

可选参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-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)的选项。

实验准备

准备两台干净的虚拟机

node3:192.168.141.12

node4:192.168.141.132

准备测试文件和测试目录

node3

1
2
3
4
5
6
[root@node3 ~]# echo "hello,i come from node3" > node3.txt
[root@node3 ~]# mkdir directory3
[root@node3 ~]# cd directory3/
[root@node3 directory3]# pwd
/root/directory3
[root@node3 directory3]#

node4

1
2
3
4
5
6
[root@node4 ~]# echo "hello,i come from node4" > node4.txt
[root@node4 ~]# mkdir directory4
[root@node4 ~]# cd directory4/
[root@node4 directory4]# pwd
/root/directory4
[root@node4 directory4]#

实例解析

1.在node3上将node3.txt发送到node4的/root/directory4目录下

这里指定了用户名,命令执行后就不需要输入用户名

1
2
3
4
5
6
7
8
9
10
[root@node3 directory3]# scp /root/node3.txt root@192.168.141.132:/root/directory4

The authenticity of host '192.168.141.132 (192.168.141.132)' can't be established.
ECDSA key fingerprint is SHA256:mJVa6J0b/NaWyJ+cbVho0hHnUDY9utS7iWUGq91HvpM.
ECDSA key fingerprint is MD5:d3:6c:dc:1c:76:df:3a:d1:b9:ef:6c:17:82:64:76:6e.
Are you sure you want to continue connecting (yes/no)? yes #这里敲yes加回车
Warning: Permanently added '192.168.141.132' (ECDSA) to the list of known hosts.
root@192.168.141.132's password: #这里输入密码
node3.txt 100% 24 4.7KB/s 00:00
[root@node3 directory3]# #上面的100%表示传输完成

我们到node4上验证一下,然后删掉node3.txt,继续做下一步实验。

1
2
3
4
5
6
7
[root@node4 directory4]# ls
node3.txt
[root@node4 directory4]# cat node3.txt
hello,i come from node3
[root@node4 directory4]# rm -f node3.txt
[root@node4 directory4]# ls
[root@node4 directory4]#

2.在node3上将node4.txt拷贝node3的/root/directory3目录下

1
2
3
4
5
6
7
8
[root@node3 directory3]# scp root@192.168.141.132:/root/node4.txt /root/directory3
root@192.168.141.132's password:
node4.txt 100% 24 22.4KB/s 00:00
[root@node3 directory3]# ls
node4.txt
[root@node3 directory3]# cat node4.txt
hello,i come from node4
[root@node3 directory3]#

说明

1.如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号。

先在node4上放行4555端口,关闭selinux,将ssh端口改为4555 。

1
2
3
4
5
6
7
8
9
10
11
[root@node4 directory4]# firewall-cmd --add-port=4555/tcp --permanent 
success
[root@node4 directory4]# firewall-cmd --reload
success
[root@node4 directory4]# setenforce 0

[root@node4 directory4]# cd /etc/ssh
[root@node4 ssh]# cat sshd_config | grep "Port"
Port 4555
#GatewayPorts no
[root@node4 ssh]# systemctl restart sshd

然后尝试用4555端口,在node3上将node3.txt发送到node4的/root/directory4目录下

1
2
3
4
[root@node3 directory3]# scp -P 4555 /root/node3.txt root@192.168.141.132:/root/directory4
root@192.168.141.132's password:
node3.txt 100% 24 6.9KB/s 00:00
[root@node3 directory3]#

最后验证一下

1
2
3
4
5
6
[root@node4 ssh]# cd /root/directory4/
[root@node4 directory4]# ls
node3.txt
[root@node4 directory4]# cat node3.txt
hello,i come from node3
[root@node4 directory4]#

实验做完了别忘了将sshd端口改回来且重启。

1
2
3
4
5
6
7
[root@node4 directory4]# sed -n '17p' /etc/ssh/sshd_config 
Port 4555
[root@node4 directory4]# sed -i 's/Port 4555/#Port 22/g' /etc/ssh/sshd_config
[root@node4 directory4]# sed -n '17p' /etc/ssh/sshd_config
#Port 22
[root@node4 directory4]# systemctl restart sshd
[root@node4 directory4]#

2.使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的。

  上面我们用的都是root用户,所以不用担心权限不够。但是我们在管理真实的服务器时,出于安全考虑,一般会禁止root远程登录服务器 。所以我们在服务器给自己创建的用户必须做好相应权限分配,避免scp时权限不够导致出错。如果因为权限不够而传送不了文件,那么sudo root借用root权限后,给自己分配相应权限,然后回头再用scp传文件就不会传不了了。

本篇到此结束

欢迎打赏,谢谢
------ 本文结束------
0%