命令简介

cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一。一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数。但是如果是在shell脚本中执行cp时,没有-i参数时不会询问是否覆盖。这说明命令行和shell脚本的执行方式有些不同。

命令格式

cp [选项]... [-T] 源 目的

或:cp [选项]... 源... 目录

或:cp [选项]... -t 目录 源...

命令功能

将源文件复制至目标文件,或将多个源文件复制至目标目录。

命令参数

-a, --archive    等于-dR --preserve=all,--backup[=CONTROL    为每个已存在的目标文件创建备份

-b                类似--backup 但不接受参数--copy-contents        在递归处理是复制特殊文件内容

-d                等于--no-dereference --preserve=links

-f, --force        如果目标文件无法打开则将其移除并重试(当 -n 选项 存在时则不需再选此项)

-i, --interactive        覆盖前询问(使前面的 -n 选项失效)

-H                跟随源文件中的命令行符号链接

-l, --link            链接文件而不复制

-L, --dereference   总是跟随符号链接

-n, --no-clobber   不要覆盖已存在的文件(使前面的 -i 选项失效)

-P, --no-dereference   不跟随源文件中的符号链接

-p                等于--preserve=模式,所有权,时间戳, --preserve[=属性列表   保持指定的属性(默认:模式,所有权,时间戳),如果 可能保持附加属性:环境、链接、xattr 等

-R, -r, --recursive  复制目录及目录内的所有项目

scp命令和执行过程分析

scp是基于ssh的安全拷贝命令(security copy),它是从古老的远程复制命令rcp改变而来,实现的是在host与host之间的拷贝,可以是本地到远程的、本地到本地的,甚至可以远程到远程复制。注意,scp可能会询问密码。
如果scp拷贝的源文件在目标位置上已经存在时(文件同名),scp会替换已存在目标文件中的内容,但保持其inode号。
如果scp拷贝的源文件在目标位置上不存在,则会在目标位置上创建一个空文件,然后将源文件中的内容填充进去。
scp拷贝本质是只是填充内容的过程,它不会去修改目标文件的很多属性。

scp [-12BCpqrv] [-l limit] [-o ssh_option] [-P port] [[user@]host1:]file1 ... [[user@]host2:]file2

选项说明:
-1:使用ssh v1版本,这是默认使用协议版本
-2:使用ssh v2版本
-C:拷贝时先压缩,节省带宽
-l limit:限制拷贝速度,Kbit/s.
-o ssh_option:指定ssh连接时的特殊选项,一般用不上。偶尔在连接过程中等待提示输入密码较慢时,可以设置GSSAPIAuthentication为no
-P port:指定目标主机上ssh端口,大写的字母P,默认是22端口
-p:拷贝时保持源文件的mtime,atime,owner,group,privileges
-r:递归拷贝,用于拷贝目录。注意,scp拷贝遇到链接文件时,会拷贝链接的源文件内容填充到目标文件中(scp的本质就是填充而非拷贝)
-v:输出详细信息,可以用来调试或查看scp的详细过程,分析scp的机制

举例子

1.把本地文件/home/a.tar.tz拷贝到远程服务器192.168.0.7上的/home/tmp,连接时使用远程的root用户:

scp /home/a.tar.tz root@192.168.0.7:/home/tmp/

2.目标主机不写路径时,表示拷贝到对方的家目录下:

scp /home/a.tar.tz root@192.168.0.7

3.把远程文件/home/a.tar.gz拷贝到本机:

scp root@192.168.0.7:/home/a.tar.tz         # 不接本地目录表示拷贝到当前目录 
scp root@192.168.0.7:/home/a.tar.tz /tmp     # 拷贝到本地/tmp目录下

4.拷贝远程机器的/home/目录到本地/tmp目录下。

scp -r root@192.168.0.7:/home/ /tmp

5.从远程主机192.168.10.8拷贝文件到另一台远程主机192.168.10.9上。

scp root@192.168.10.8:/tmp/copy.txt root@192.168.10.9:/tmp

在远程复制到远程的过程中,例如在本地执行scp命令将A主机(192.168.10.8)上的/tmp/copy.txt复制到B主机(192.168.10.9)上的/tmp目录下,如果使用-v选项查看调试信息的话,会发现它的步骤类似是这样的。

# 以下是从结果中提取的过程
# 首先输出本地要执行的命令
Executing: /usr/bin/ssh -v -x -oClearAllForwardings yes -t -l root 192.168.10.8 scp -v /tmp/copy.txt root@192.168.10.9:/tmp # 从本地连接到A主机
debug1: Connecting to 192.168.10.8 [192.168.10.8] port .
debug1: Connection established. # 要求验证本地和A主机之间的连接
debug1: Next authentication method: password
root@192.168.10.8's password: # 将scp命令行修改后发送到A主机上
debug1: Sending command: scp -v /tmp/copy.txt root@192.168.10.9:/tmp # 在A主机上执行scp命令
Executing: program /usr/bin/ssh host 192.168.10.9, user root, command scp -v -t /tmp # 验证A主机和B主机之间的连接
debug1: Next authentication method: password
root@192.168.100.62's password: # 从A主机上拷贝源文件到最终的B主机上
debug1: Sending command: scp -v -t /tmp
Sending file modes: C0770 copy.txt
Sink: C0770 copy.txt
copy.txt % .0KB/s # 关闭本地主机和A主机的连接
Connection to 192.168.10.8 closed.

也就是说,远程主机A到远程主机B的复制,实际上是将scp命令行从本地传递到主机A上,由A自己去执行scp命令。也就是说,本地主机不会和主机B有任何交互行为,本地主机就像是一个代理执行者样,只是帮助传送scp命令行以及帮助显示信息。
其实从本地主机和主机A上的~/.ssh/know_hosts文件中可以看出,本地主机只是添加了主机A的信息,并没有添加主机B的信息,而在主机A上则添加了主机B的信息。

Linux命令之---cp/scp的更多相关文章

  1. 【Linux 命令】cp 命令详解

    Linux 命令之 cp 命令详解 一.cp 命令简介 cp 命令主要用于复制文件或目录.即用来将一个或多个源文件或者目录复制到指定的目的文件或目录. cp 命令可以将单个源文件复制成一个指定文件名的 ...

  2. 每天一个linux命令:cp(8)

    cp cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下.cp命令还支持同时复制多个文件,当一次复制多个文件时, ...

  3. 每天一个linux命令(8):scp使用

    不同的Linux之间copy文件常用有3种方法:1.使用ftp,也就是其中一台Linux安装ftp Server,这样可以另外一台使用ftp的client程序来进行文件的copy.2.采用samba服 ...

  4. Linux命令集锦:scp命令

    scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的,可能会稍微影响一下速度.当你服务器硬盘变为只读 read on ...

  5. 每天一个Linux命令(7): cp

    cp命令         该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大.         语法: cp [选项] 源文件或目录 目标文件或目录 ...

  6. 【Linux基础】常用Linux命令: cd, cp, ls, mkdir, mv, rm, su, uname

    常用Linux命令:cd, cp, ls, mkdir, mv, rm, su, uname cd命令:切换当前工作目录至 dirName(目录参数) 其中 dirName 可为绝对路径或相对路径.若 ...

  7. 每天一个linux命令(6):cp

    1.命令简介 cp(Copy file):将源文件复制至目标文件,或将多个源文件复制至目标目录. 2.用法 cp [选项]... [-T] 源文件 目标文件 或:cp [选项]... 源文件... 目 ...

  8. linux 命令——8 cp (转)

    cp 命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在, 就会询问是否覆盖,不管你是否使用-i参数.但是如 ...

  9. Linux命令学习-cp命令

    Linux中,cp命令的全称是copy,主要作用是复制文件或文件夹,类似于Windows下的复制功能. 假设当前处于wintest用户的主目录,路径为 /home/wintest ,存在文件夹test ...

随机推荐

  1. Department Highest Salary

    The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...

  2. NOIP2013Day1T3 表示只能过一个点

    •A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的 ...

  3. 自定义列表dl

    语法格式 <dl> <dt>名词1</dt> <dd>名词1解释1</dd> <dd>名词1解释2</dd> ... ...

  4. Android 桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 先谈一下基本的实现原理,这种桌面悬浮窗的效果很 ...

  5. 【c++】用c++编写的求任意区间的素数的小程序

    #include using namespace std; int main() { cout<<"*************************************** ...

  6. silverlight数据绑定模式TwoWay,OneWay,OneTime的研究

    asp.net开发中,数据绑定是一个很简单的概念,控件与数据绑定后,控件可以自动把数据按一定的形式显示出来.(当然控件上的值改变后,可以通过提交页面表单,同时后台服务端代码接收新值更新数据) silv ...

  7. MySQL-数据类型及选择

    一.数据类型 详见:http://www.runoob.com/mysql/mysql-data-types.html 二.类型选择 整形>date,time>enum,char>v ...

  8. .net密码找回

    using System; using System.Collections.Generic; using System.Text; using System.Net.Mail; using Syst ...

  9. HTML、CSS、JS、JQ速查笔记

      一.HTML  1.编写html文件 a.格式 <!DOCTYPE html> <html> <head> <title>标题</title& ...

  10. SAP Cloud for Customer Extensibility的设计与实现

    今天的文章来自Jerry的同事,SAP成都研究院C4C开发团队的开发人员徐欢(Xu Boris).徐欢就坐我左手边的位置,因此我工作中但凡遇到C4C的技术问题,一扭头就可以请教他了,非常方便.下图是他 ...