scp命令和rsync命令

scp命令和rsync命令区别
scp传输是加密的,可能会稍微影响一下速度,scp不占资源,不会提高多少系统负荷,
虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用
scp -P 29022 jkzg-cms.tar.gz 192.107.108.108:./

scp -r ws_gj_jkzg.201911.sql.tar.gz [email protected]:/data/data1

psql -U wsgjjkzg -d t_gj_tzy < /data/data1/t_gj_tzy.20191031235825.sql

scp命令

命令格式:

1  scp local_file remote_username@remote_ip:remote_folder

2  scp local_file remote_username@remote_ip:remote_file

3  scp local_file remote_ip:remote_folder

4  scp local_file remote_ip:remote_file

实例

实例1:从远处复制文件到本地目录
命令:从181.137.128.103机器上的/opt/soft/的目录中下载nginx-0.5.38.tar.gz 文件到本地/opt/soft/目录中

scp [email protected]:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/

实例2:从远处复制到本地
命令:从181.137.128.103器上的/opt/soft/中下载mongodb 目录到本地的/opt/soft/目录来

scp -r [email protected]:/opt/soft/mongodb /opt/soft/

实例3:上传本地文件到远程机器指定目录
命令:复制本地opt/soft/目录下的文件nginx-0.5.38.tar.gz 到远程机器192.168.120.204的opt/soft/scptest目录

scp /opt/soft/nginx-0.5.38.tar.gz [email protected]:/opt/soft/scptest

实例4:上传本地目录到远程机器指定目录
命令:

scp -r /opt/soft/mongodb [email protected]:/opt/soft/scptest

案例

从本地复制到远程

命令格式:

scp local_file remote_username@remote_ip:remote_folder 
或者 
scp local_file remote_ip:remote_file 

应用实例:
scp命令和rsync命令_第1张图片

scp /home/space/music/1.mp3 [email protected]:/home/root/others/music 
scp /home/space/music/1.mp3 [email protected]:/home/root/others/music/001.mp3 
scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music 

从远程复制到本地
应用实例:

scp [email protected]:/home/root/others/music /home/space/music/1.mp3 
scp -r www.runoob.com:/home/root/others/ /home/space/music/

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

#scp 命令使用端口号 4588
scp -P 4588 [email protected]:/usr/local/sin.sh /home/administrator

应用实例
把本机A上的文件拷贝到远程机器B上
拷贝所有的sql数据库到本地192.167.108.101的home目录

scp -r *.sql [email protected]:./  

端口拷贝
通过端口拷贝数据到192.167.108.101的home目录

scp -P 29022 wmsvc.tar.gz  192.107.108.108:./

拷贝本机elasticsearch下的所有文件到192.107.108.100的home目录

scp -p 29022 elasticsearch* 192.107.108.100:./

拷贝本机软件到192.107.108.109的home目录

scp -p 29022 postgresql-9.6.1-1-linux-x64.run 192.107.108.109:./

把A机器上的/home/目录下文件,拷贝到B机器上tmp目录文件下

scp /home/lizi/3.txt [email protected]:/tmp

把远程机器上的文件拷贝到本机
把远程机器B上的文件拷贝到本机A

把远程B机器上的/home/hundsun/appcom目录下所有文件,拷贝到A机器上的目录文件下
在本机A上命令窗口终端输入命令

scp 10.20.27.239:/home/hundsun/appcom/* /home/hundsun/test

特殊点注意
1、如果因为安全策略,需要加上端口,则,命令格式如下:

scp -p 9022   10.20.27.239:/home/hundsun/appcom/* /home/hundsun/test

其中9022是端口地址
2、使用scp要注意所使用的用户是否具有可读取远程服务器相应文件的权限。

3、对拷文件夹 (包括文件夹本身)需要加上-r

scp -r  10.20.27.239:/home/hundsun/appcom /home/hundsun/test

参考案例
1、从服务器上下载文件
scp username@servername:/path/filename /var/www/local_dir(本地目录)

 例如scp [email protected]:/var/www/test.txt  把192.168.0.101上的/var/www/test.txt 的文件下载到/var/www/local_dir(本地目录)

2、上传本地文件到服务器
scp /path/filename username@servername:/path

例如scp /var/www/test.php  [email protected]:/var/www/  把本机/var/www/目录下的test.php文件上传到192.168.0.101这台服务器上的/var/www/目录中

3、从服务器下载整个目录

scp -r username@servername:/var/www/remote_dir/(远程目录) /var/www/local_dir(本地目录)
例如:scp -r [email protected]:/var/www/test  /var/www/ 

4、上传目录到服务器

scp  -r local_dir username@servername:remote_dir
例如:scp -r test  [email protected]:/var/www/   把当前目录下的test目录上传到服务器的/var/www/ 目录

Linux篇:scp免密传输文件

01 前言
scp命令都很熟悉,通常用于服务器之间文件传输,但是经常应用此场景的童鞋会发现每次都需输入密码,操作有点繁琐。

接下来介绍免密传输的办法

02 实现过程
假设有两台服务器 10.137.128.182 (服务器A)、10.137.128.182(服务器B)

1、在服务器A上生成密钥,敲以下命令

ssh-keygen -t rsa

2、以下3步直接敲回车
scp命令和rsync命令_第2张图片
可以看到,服务器A的密钥已生成,路径为/root/.ssh/id_rsa.pub

3、将生成的密钥复制到远程机器上,即服务器B,放到/root/.ssh/authorized_keys文件中

scp  /root/.ssh/id_rsa.pub [email protected]:/root.ssh/

此环节需要输入密码:******

4、在远程服务器B上将复制过来的id_rsa.pub文件

4.1 如果/root/.ssh/下已存在authorized_keys文件

cat  id_rsa.pub >>  authorized_keys

4.2 如果/root/.ssh/下不存在authorized_keys文件

mv  id_rsa.pub  authorized_keys

其实这里重定向也一样

5、此时两台机器已建立信任关系了,A到B即可以实现免密传输了,如果要实现B到A免密传输,操作是一样的

03 其他办法
其实也可以通过其他非交互式工具如execpt去实现,关于这个工具,我会接下来实验成功后再开文章记录…

rsync命令

rsync -e “ssh -p 22 -o StrictHostKeyChecking=no” /etc/fstab 172.16.10.5:/tmp

rsync有三种工作方式:

(1).本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。

(2).本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。

(3).本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。

基础示例

(1).将/etc/fstab拷贝到/tmp目录下。

[root@localhost ~]# rsync /etc/fstab /tmp

(2).将/etc/cron.d目录拷贝到/tmp下。

[root@localhost ~]# rsync -r /etc/cron.d /tmp

该命令会在目标主机上创建/tmp/cron.d目录,并将/etc/cron.d/中的文件放入到/tmp/cron.d/目录中,也就是说默认情况下,是不会在目录路径下创建上层目录/etc的。

(3).将/etc/cron.d目录拷贝到/tmp下,但要求在/tmp下也生成etc子目录。

[root@localhost ~]# rsync -R -r /etc/cron.d /tmp

其中"-R"选项表示使用相对路径,此相对路径是以目标目录为根的。对于上面的示例,表示在目标上的/tmp下创建etc/cron.d目录,即/tmp/etc/cron.d,etc/cron.d的根"/"代表的就是目标/tmp。

(4).对远程目录下已存在文件做一个备份。
[root@localhost ~]# rsync -R -r --backup /var/./log/anaconda /tmp
[root@localhost tmp]# ll log/anaconda/
这样在目标目录下,已存在的文件就被做一个备份,备份文件默认使用"~“做后缀,可以使用”–suffix"指定备份后缀。

[root@localhost ~]# mkdir /tmp/log_back

[root@localhost ~]# rsync -R -r --backup --backup-dir=/tmp/log_back /var/./log/anaconda /tmp
指定备份路径后,默认将不会加备份后缀,除非使用"–suffix"显式指定后缀,如"–suffix=~"。

[root@localhost tmp]# tree /tmp/log_back/

(5)源目录后加 / 和不加 / 的区别
加 /


[root@nfs01 ~]# ls    主机B ip,192.168.88.31
logs  old 
[root@backup ~]# ls   主机A ip,192.168.88.41
logs  old  passwd
[root@backup ~]# mkdir test
[root@backup ~]# touch test/stu{1..10}
[root@backup ~]# rsync -avz test/ -e 'ssh -p 22' [email protected]:/root/
[email protected]'s password: 
sending incremental file list
省略
sent 465 bytes  received 205 bytes  191.43 bytes/sec
total size is 0  speedup is 0.00
[root@nfs01 ~]# ls    主机B查看结果
logs  old  stu1  stu10  stu2  stu3  stu4  stu5  stu6  stu7  stu8  stu9

不加 /

[root@backup ~]# rsync -avz test -e 'ssh -p 22' [email protected]:/root/
[email protected]'s password: 
sending incremental file list
test/
test/stu1
省略
sent 508 bytes  received 206 bytes  204.00 bytes/sec
total size is 0  speedup is 0.00
[root@nfs01 ~]# ls         主机B查看结果,test目录在最后一列
logs  old  stu1  stu10  stu2  stu3  stu4  stu5  stu6  stu7  stu8  stu9  test

–delete 用法

[root@backup ~]# rsync --delete -az ./ -e 'ssh -p 22' [email protected]:/root/
[email protected]'s password: 
[root@backup ~]# ls
logs  old  passwd  test            
[root@backup ~]# tree
省略
3 directories, 24 files     主机A的文件
 
[root@nfs01 ~]# ls
logs  old  passwd  test            
[root@nfs01 ~]# tree
省略
3 directories, 24 files     主机B的文件

(6)指定ssh连接参数,如端口、连接的用户、ssh选项等。
rsync -e “ssh -p 22 -o StrictHostKeyChecking=no” /etc/fstab 192.168.1.131:/tmp/3.txt
[email protected]’s password:
常见问题 :
Permission denied, please try again.
/tmp/3.txt没有权限

(7)从远程主机A拷贝文件到B
A :授予文件特定的拷贝用户权限

root@ubuntu:/tmp# chown -R wzq.wzq 2.txt         #授于wzq用户2.txt文档权权限
root@ubuntu:/tmp# ls -l
total 920
-rw-r--r-- 1 wzq  wzq    1918 Nov  1 14:30 2.txt
drwx------ 2 root root   4096 Sep 19 10:07 vmware-root

B :执行拷贝命令

root@ubuntu:/tmp# rsync -av /etc/passwd [email protected]:/tmp/2.txt 
[email protected]'s password: 
sending incremental file list
passwd

sent 2,010 bytes  received 35 bytes  454.44 bytes/sec
total size is 1,918  speedup is 0.94
root@ubuntu:/tmp# ls -l                 #查看拷贝的文件
total 20
-rwxr-xr-x 1 user1 user1    6 Oct 31 20:42 1.txt
-rw-r--r-- 1 root  root  1918 Oct 31 23:30 2.txt

(8)、–exclude 过滤指定文件
如–exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步

从/root/111/ 下的文件不包含.txt文档的,都拷贝到/tmp/222/

root@ubuntu:~# rsync -avL exclude "*.log" /root/111/ /tmp/222/
sending incremental file list
rsync: link_stat "/root/exclude" failed: No such file or directory (2)
rsync: link_stat "/root/*.log" failed: No such file or directory (2)
./
1.log
11.txt
sent 170 bytes  received 57 bytes  454.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1]
root@ubuntu:~# ls 111
11.txt  1.log
root@ubuntu:~# cd /tmp/222
root@ubuntu:/tmp/222# ls
11.txt  1.log

-P 显示同步过程,比如速率,比-v更加详细
scp命令和rsync命令_第3张图片
(9)、rsync通过ssh同步

rsync -av /etc/passwd 172.16.17.70:/tmp/momo.txt (从a推送到b) 

也可以反过来操作:

rsync -avP 172.16.17.70:/tmp/momo.txt /tmp/123.txt (从b拉数据到a) 
rsync -av -e “ssh -p 22” test1/ 192.168.133.132:/tmp/test2/ (端口不一定为22的时候使用这个命令) 

(10)、从远程主机拷贝到本地
*拷贝192.168.1.131上面的一个文件到本地机器:

rsync -v [email protected]:/home/1.txt
[email protected]'s password: 
receiving file list ... done
-rw-r--r--              0 2019/11/01 01:04:44 1.txt

sent 20 bytes  received 39 bytes  16.86 bytes/sec
total size is 0  speedup is 0.00
root@ubuntu:~# cd /home
root@ubuntu:/home# ls
lin  postgres  user1  wzq

拷贝文件并且显示进度:

$ rsync --progress [email protected]:/home/quietheart/tmpTrans/linux.tar.gz ./ 

常见问题 :
1、请问直接使用rsync和rsync -e ssh有啥差别?
rsync -e ssh 走的是ssh协议,都可以使用

2、192.168.1.131拷贝到本地
rsync -avP [email protected]:/tmp/22.txt
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1655) [Receiver=3.1.1]
rsync: [Receiver] write error: Broken pipe (32)

A操作 :
#chown -R wzq.wzq 22.txt
/home# chmod 755 22.txt
B操作 :
rsync -avP [email protected]:/tmp/22.txt
解决办法 :

参考链接:
https://www.runoob.com/linux/linux-comm-scp.html

Linux篇:scp命令 : https://www.jianshu.com/p/2fdddb50c015

rsync
https://blog.csdn.net/jiangyu1013/article/details/79754060
https://blog.csdn.net/yujia_666/article/details/93745147
https://blog.csdn.net/qq_37120573/article/details/82632797
rsync工具介绍、rsync常用选项和rsync通过ssh同步 :https://blog.csdn.net/mojianbin/article/details/78720618
https://blog.csdn.net/dragon434/article/details/81124817
Linux命令学习手册-rsync命令 :https://blog.csdn.net/dragon434/article/details/81124817

你可能感兴趣的:(常用命令,Ubuntu)