主机名master:10.0.0.10 文件传输方
主机名node1: 10.0.0.11 文件接收方
说明:
scp与sftp作为运行SSH服务的远程系统来回传输文件的安全方式,是将远程文件进行复制到另一个系统。在使用scp与sftp之前,需要能够完成ssh远程连接。
rsync命令则用来同步不同系统的文件。它与scp的区别在于,如果两个系统的文件或目录有差异,rsync只复制差异部分,而scp则复制全部内容。
可以直接查看sshd的端口22是否被监听
[root@master .ssh]# netstat -lntup|grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6940/sshd
tcp6 0 0 :::22 :::* LISTEN 6940/sshd
也可以使用systemctl
命令检查sshd服务的启动状态
[root@master .ssh]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-12-10 00:03:13 CST; 3 days ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 6940 (sshd)
Tasks: 1
CGroup: /system.slice/sshd.service
└─6940 /usr/sbin/sshd -D
使用scp 本地文件 远程主机IP:文件路径
格式来将本地文件复制到远端。
输入命令后,要求提供远程主机root账号的密码,正确输入密码后文件传输成功。
[root@master .ssh]# scp /etc/hosts 10.0.0.11:/tmp
The authenticity of host '10.0.0.11 (10.0.0.11)' can't be established.
ECDSA key fingerprint is SHA256:XcbgLkoJin+3R2uL/9R8sxuELxjYJOQOABBFodvwug0.
ECDSA key fingerprint is MD5:ee:69:ca:49:b0:6a:78:68:ea:15:3a:7d:d9:a3:a1:1f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.11' (ECDSA) to the list of known hosts.
[email protected]'s password:
hosts
此时我们检查10.0.0.11的主机,可以发现 /tmp 目录下的 /etc/hosts 文件。
[root@node1 ~]# ll /tmp/hosts
-rw-r--r-- 1 root root 214 Dec 13 09:45 /tmp/hosts
除了可以将本地文件复制到远端,也可以将远端的目录下面的文件拉取到本地。
这里涉及了两个常用的参数。
-r 递归的形式复制目录下的文件
-p 复制远程系统的文件时,不改变其文件属性
将远端的/server/scripts
下的脚本拉取复制到本地/tmp
目录下
首先清理不需要的文件。
[root@master ~]# cd /tmp/
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0
其次,复制远端的脚本。
[root@master tmp]# scp -rp 10.0.0.11:/server/scripts/ /tmp/
[email protected]'s password:
ping.sh 100% 1 0.5KB/s 00:00
vim.sh 100% 448 146.4KB/s 00:00
输入密码后,会显示复制过来的文件。
然后进行检查确认。
[root@master tmp]# ll
total 0
drwxr-xr-x 2 root root 35 Dec 13 10:04 scripts
[root@master tmp]# tree
.
└── scripts
├── ping.sh
└── vim.sh
1 directory, 2 files
由此可见,将远端的目录与目录下的文件一起复制了。
使用该命令,我们可以将远端文件下载到本地,也可以将本地文件上传到远端。
命令后跟上远端的IP,就可以进入交互式界面。
进入到远端的tmp目录下,将本地刚刚获取的脚本放到远端的tmp目录下。
使用put
,将本地文件复制到远端。
[root@master tmp]# sftp 10.0.0.11
[email protected]'s password:
Connected to 10.0.0.11.
sftp> cd /tmp/
sftp> put /tmp/scripts/ping.sh
Uploading /tmp/scripts/ping.sh to /tmp/ping.sh
/tmp/scripts/ping.sh 100% 1 0.1KB/s 00:00
首先清理一下我们刚才获得的tmp目录下的脚本。
[root@master ~]# cd /tmp/
[root@master tmp]# ll
total 0
drwxr-xr-x 2 root root 35 Dec 13 10:04 scripts
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0
然后进入交互式界面,进入远端的/server/scripts
目录,获取脚本
[root@master tmp]# sftp 10.0.0.11
[email protected]'s password:
Connected to 10.0.0.11.
sftp> cd /server/scripts/
sftp> get vim.sh
Fetching /server/scripts/vim.sh to vim.sh
/server/scripts/vim.sh 100% 448 316.0KB/s 00:00
sftp> ^D
[root@master tmp]# ll
total 4
-rw-r--r-- 1 root root 448 Dec 13 10:20 vim.sh
需要注意的是,上传和下载最后存放文件的位置,默认是我们交互式命令开始前,所在的目录下。因此想要上传文件,需要先进入某目录,然后put
该文件;想要下载文件至某目录,必须先进入那个目录,然后开启交互式命令,再在远端get
该文件。
首先清理之前的环境,确保文件可以完整的传输。
# 10.0.0.10
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0
# 10.0.0.11
[root@node1 .ssh]# cd /tmp/
[root@node1 tmp]# ll
total 8
-rw-r--r-- 1 root root 214 Dec 13 09:45 hosts
-rw-r--r-- 1 root root 1 Dec 13 10:16 ping.sh
drwx------ 3 root root 17 Dec 13 2022 systemd-private-6e8f91e32c7e42eb98a65c2931c4842d-cups.service-eVdmK7
drwx------ 2 root root 6 Dec 9 23:04 vmware-root_6590-692621205
drwx------ 2 root root 6 Dec 9 17:06 vmware-root_6592-961069012
drwx------ 2 root root 6 Dec 13 2022 vmware-root_6631-1991582773
[root@node1 tmp]# rm -rf *
[root@node1 tmp]# ll
total 0
首先检查本地系统是否有该命令的软件包,能否使用命令。
[root@master tmp]# rpm -qa|grep rsync
rsync-3.1.2-4.el7.x86_64
# 如果没有rsync命令,则yum安装
[root@master tmp]# yum install -y rsync
命令格式与scp类似,rsync 参数 本地目录或文件 远端IP:绝对路径
[root@master tmp]# rsync -avz /etc/hosts 10.0.0.11:/tmp
[email protected]'s password:
sending incremental file list
hosts
sent 172 bytes received 35 bytes 59.14 bytes/sec
total size is 214 speedup is 1.03
文件准确传输。
[root@node1 tmp]# ll
total 4
-rw-r--r-- 1 root root 214 Nov 28 14:00 hosts
[root@node1 tmp]# cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.10 master
10.0.0.11 node1
10.0.0.12 node2
首先准备环境。
在/tmp
目录下创建两个文件。
[root@master tmp]# touch master1.sh master2.sh
[root@master tmp]# ll
total 0
-rw-r--r-- 1 root root 0 Dec 13 10:33 master1.sh
-rw-r--r-- 1 root root 0 Dec 13 10:33 master2.sh
然后先传输文件。
[root@master tmp]# rsync -avz /tmp/ 10.0.0.11:/tmp
[email protected]'s password:
sending incremental file list
./
master1.sh
master2.sh
sent 305 bytes received 62 bytes 104.86 bytes/sec
total size is 0 speedup is 0.00
检查发现,远端收到了两个普通文件。
[root@master tmp]# rsync -avz /tmp/ 10.0.0.11:/tmp
[email protected]'s password:
sending incremental file list
./
master1.sh
master2.sh
sent 305 bytes received 62 bytes 104.86 bytes/sec
total size is 0 speedup is 0.00
然后再传输目录。
[root@master tmp]# rsync -avz /tmp 10.0.0.11:/tmp
[email protected]'s password:
sending incremental file list
tmp/
tmp/master1.sh
tmp/master2.sh
tmp/.ICE-unix/
tmp/.Test-unix/
tmp/.X11-unix/
tmp/.XIM-unix/
tmp/.font-unix/
sent 329 bytes received 78 bytes 116.29 bytes/sec
total size is 0 speedup is 0.00
这次输出的信息好像有点多,然后检查一下远端10.0.0.11的结果。
[root@node1 tmp]# ll
total 4
-rw-r--r-- 1 root root 214 Nov 28 14:00 hosts
-rw-r--r-- 1 root root 0 Dec 13 10:33 master1.sh
-rw-r--r-- 1 root root 0 Dec 13 10:33 master2.sh
drwxrwxrwt 7 root root 129 Dec 13 10:33 tmp
不难发现,这次准确的将目录以及下面的文件都同步了过来。
所以,需要注意的是,如果源目录(被传输的目录)后面有 /
,例如/tmp/
,那么将只传输目录/tmp
下面的文件;如果源目录(被传输的目录)后面没有 /
,例如/tmp
,那么将传输整个目录/tmp
及下面的文件。
参数-a
是一个存档参数,包括下面参数的功能之和。
参数 | 作用 |
---|---|
-r | 以递归方式同步整个目录树 |
-l | 同步软连接 |
-p | 保留权限 |
-t | 保留时间戳 |
-g | 保留属组权限 |
-o | 保留文件所有者 |
-D | 同步设备文件 |
参数-v
,在文件同步时会输出详细的添加信息。
参数-z
,在文件传输时进行压缩提高效率。
此处需要注意的是,参数-a
不会同步高级文件的权限。
要开启ACL同步,需要再添加-A
参数;
要将源文件的SELINUX同步到目标文件,需要添加-X
参数。
此外,上文的举例说明是将本地文件同步到远端,也可以将远端文件同步到本地,只需要参数位置换即可。