命令简介

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. <linux下内置命令和外部命令>

    Linux下内置命令和外部命令 1.linux的命令可以分为内部命令和外部命令: 内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高. 而外部命令是系统的软件功能,用户需要时才从硬盘中读入内 ...

  2. C++中的引用和指针

    引用和指针有何区别?何时只能使用指针而不能使用引用?    引用是一个别名,不能为 NULL 值,不能被重新分配:指针是一个存放地址的变量.当需要对变量重新赋以另外的地址或赋值为 NULL 时只能使用 ...

  3. ElasticSearch服务器操作命令

    在win7环境,进入elasticsearch安装目录的bin目录: 1. elasticsearch.bat 就可以启动elasticsearch了.运行这个插件的好处是:elasticsearch ...

  4. 《C#高效编程》读书笔记05-为类型提供ToString()方法

    System.Object.ToString()是.NET环境中最常用的方法之一.编写类型时,要提供一个合理的ToString版本,否则使用者就不得不自己构造一套可以阅读的表示. public cla ...

  5. php允许被跨域ajax请求

    只要在被请求端,加一句: header('Access-Control-Allow-Origin: *');

  6. 谷歌插件 JSON-Handle

    JSON-Handle http://jsonhandle.sinaapp.com/ 点击下载 插件下载后,在浏览器输入:chrome://extensions/ 将下载后的文件拖入 chrome浏览 ...

  7. 给类型为text的input设置value值却无法修改

    给类型为text的input设置value值后就无法修改了 我的页面显示为如下但是退格却无法改变他的值 原来是缺少onChange事件,没法监听value的改变 所以需要添加 onChange={th ...

  8. Day2 HTML基本标签元素

    Day2   HTML基本标签元素 HTML:  超文本标记语言(HyperText   Mark-up  Language ) 1.作用:写网页结构  2.HTML不区分大小写,建议小写   3.文 ...

  9. 使用vuex管理数据

    src/vuex/store.js 组件里面使用引入store.js,注意路径 import store from 'store.js' 然后在使用的组件内data(){}同级放入store 三大常用 ...

  10. LaTeX 符号大全

    常用数学符号的 LaTeX 表示方法 2016-10-31 16:22 | 黄荣生   常用数学符号的 LaTeX 表示方法 1.指数和下标可以用^和_后加相应字符来实现.比如: 2.平方根(squa ...