Linux中SSH的SCP传输命令运⽤详解
Linux系统管理员应该很熟悉CLI环境,因为通常在Linux服务器中是不安装GUI的。SSH可能是Linux系统管理员通过远程⽅式安全管理服务器的最流⾏协议。在SSH命令中内置了⼀种叫SCP的命令,⽤来在服务器之间安全传输⽂件。
以下命令可以解读为:⽤“username account”“拷贝 source file name”到“destination host”上的“destination folder”⾥。
SCP命令的基本语法
复制代码
代码如下:
scp source_file_name username@destination_host:destination_folder
SCP命令有很多可以使⽤的参数,这⾥指的是每次都会⽤到的参数。
⽤-v参数来提供SCP进程的详细信息
ssh命令指定端口
不带参数的基本SCP命令会在后台拷贝⽂件,除⾮操作完成或者有错误出现,否则⽤户在界⾯上是看不到任何提⽰信息的。你可以⽤“-v”参数来在屏幕上打印出调试信息,这能帮助你调试连接、认证和配置的⼀些问题。
复制代码
代码如下:
pungki@mint ~/Documents $ scp -v Label.pdf :.
部分输出
复制代码
代码如下:
Executing: program /usr/bin/ssh , user mrarianto, command scp -v -t .
OpenSSH_6.0p1 Debian-3, OpenSSL 1.0.1c 10 May 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting [] port 22.
debug1: Connection established.
debug1: Host '' is known and matches the RSA host key.
debug1: Found key in /home/pungki/.ssh/known_hosts:1
debug1: ssh_rsa_verify: signature correct
debug1: Next authentication method: password
's password:
debug1: Authentication succeeded (password).
Authenticated ([]:22).
Sending file modes: C0770 ******* Label.pdf
Sink: C0770 ******* Label.pdf
Label.pdf 100% 3672KB 136.0KB/s 00:27
Transferred: sent 3766304, received 3000 bytes, in 65.2 seconds
Bytes per second: sent 57766.4, received 46.0
debug1: Exit status 0
从源⽂件获取修改时间、访问时间和模式
“-p”参数会帮到把预计的时间和连接速度会显⽰在屏幕上。
复制代码
代码如下:
pungki@mint ~/Documents $ scp -p Label.pdf :.
部分输出
复制代码
代码如下:
's password:
Label.pdf 100% 3672KB 126.6KB/s 00:29
⽤-C参数来让⽂件传输更快
有⼀个参数能让传输⽂件更快,就是“-C”参数,它的作⽤是不停压缩所传输的⽂件。它特别之处在于压缩是在⽹络传输中进⾏,当⽂件传到⽬标服务器时,它会变回压缩之前的原始⼤⼩。
来看看这些命令,我们使⽤⼀个93 Mb的单⼀⽂件来做例⼦。
复制代码
代码如下:
pungki@mint ~/Documents $ scp -pv messages.log :.
部分输出
复制代码
代码如下:
Executing: program /usr/bin/ssh , user mrarianto, command scp -v -p -t .
OpenSSH_6.0p1 Debian-3, OpenSSL 1.0.1c 10 May 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting [] port 22.
debug1: Connection established.
debug1: identity file /home/pungki/.ssh/id_rsa type -1
debug1: Found key in /home/pungki/.ssh/known_hosts:1
debug1: ssh_rsa_verify: signature correct
debug1: Trying private key: /home/pungki/.ssh/id_rsa
debug1: Next authentication method: password
's password:
debug1: Authentication succeeded (password).
Authenticated ([]:22).
debug1: Sending command: scp -v -p -t .
File mtime 1323853868 atime 1380425711
Sending file timestamps: T1323853868 0 1380425711 0
messages.log 100% 93MB 58.6KB/s 27:05
Transferred: sent 97614832, received 25976 bytes, in 1661.3 seconds
Bytes per second: sent 58758.4, received 15.6
debug1: Exit status 0
不⽤“-C”参数来拷贝⽂件,结果⽤了1661.3秒,你可以⽐较下⽤了“-C”参数之后的结果。
复制代码
代码如下:
pungki@mint ~/Documents $ scp -Cpv messages.log :.
部分输出
复制代码
代码如下:
Executing: program /usr/bin/ssh , user mrarianto, command scp -v -p -t .
OpenSSH_6.0p1 Debian-3, OpenSSL 1.0.1c 10 May 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting [] port 22.
debug1: Connection established.
debug1: identity file /home/pungki/.ssh/id_rsa type -1
debug1: Host '' is known and matches the RSA host key.
debug1: Found key in /home/pungki/.ssh/known_hosts:1
debug1: ssh_rsa_verify: signature correct
debug1: Next authentication method: publickey
debug1: Trying private key: /home/pungki/.ssh/id_rsa
debug1: Next authentication method: password
's password:
debug1: Enabling compression at level 6.
debug1: Authentication succeeded (password).
Authenticated ([]:22).
debug1: channel 0: new [client-session]
debug1: Sending command: scp -v -p -t .
File mtime 1323853868 atime 1380428748
Sending file timestamps: T1323853868 0 1380428748 0
Sink: T1323853868 0 1380428748 0
Sending file modes: C0600 97517300 messages.log
messages.log 100% 93MB 602.7KB/s 02:38
Transferred: sent 8905840, received 15768 bytes, in 162.5 seconds
Bytes per second: sent 54813.9, received 97.0
debug1: Exit status 0
debug1: compress outgoing: raw data 97571111, compressed 8806191, factor 0.09
debug1: compress incoming: raw data 7885, compressed 3821, factor 0.48
看到了吧,压缩了⽂件之后,传输过程在162.5秒内就完成了,速度是不⽤“-C”参数的10倍。如果你要通过⽹络拷贝很多份⽂件,那么“-C”参数能帮你节省掉很多时间。
有⼀点我们需要注意,这个压缩的⽅法不是适⽤于所有⽂件。当源⽂件已经被压缩过了,那就没办法再压缩很多了。诸如那些像.zip,.rar,pictures和.iso的⽂件,⽤“-C”参数就没什么意义。
选择其它加密算法来加密⽂件
SCP默认是⽤“AES-128”加密算法来加密传输的。如果你想要改⽤其它加密算法来加密传输,你可以⽤“-c”参数。我们来瞧瞧。
复制代码
代码如下:
pungki@mint ~/Documents $ scp -c 3des Label.pdf :.
's password:
Label.pdf 100% 3672KB 282.5KB/s 00:13
上述命令是告诉SCP⽤3des algorithm来加密⽂件。要注意这个参数是“-c”(⼩写)⽽不是“-C“(⼤写)。
限制带宽使⽤
还有⼀个很有⽤的参数是“-l”参数,它能限制使⽤带宽。如果你为了拷贝很多⽂件⽽去执⾏了⼀份⾃动化脚本⼜不希望带宽被SCP进程耗尽,那这个参数会⾮常管⽤。
复制代码
代码如下:
pungki@mint ~/Documents $ scp -l 400 Label.pdf :.
's password:
Label.pdf 100% 3672KB 50.3KB/s 01:13
在“-l”参数后⾯的这个400值意思是我们给SCP进程限制了带宽为50 KB/秒。有⼀点要记住,带宽是以千⽐特/秒 (kbps)表⽰的,⽽8 ⽐特等于1 字节。
因为SCP是⽤千字节/秒 (KB/s)计算的,所以如果你想要限制SCP的最⼤带宽只有50 KB/s,你就需要设置成50 x 8 = 400。
指定端⼝
通常SCP是把22作为默认端⼝。但是为了安全起见SSH 监听端⼝改成其它端⼝。⽐如说,我们想⽤2249端⼝,这种情况下就要指定端⼝。命令如下所⽰。
复制代码
代码如下:
pungki@mint ~/Documents $ scp -P 2249 Label.pdf :.
's password:
Label.pdf 100% 3672KB 262.3KB/s 00:14
确认⼀下写的是⼤写字母“P”⽽不是“p“,因为“p”已经被⽤来保留源⽂件的修改时间和模式(LCTT 译注:和 ssh 命令不同了)。
递归拷贝⽂件和⽂件夹
有时我们需要拷贝⽂件夹及其内部的所有⽂件/⼦⽂件夹,我们如果能⽤⼀条命令解决问题那就更好了。SCP⽤“-r”参数就能做到。
复制代码
代码如下:
pungki@mint ~/Documents $ scp -r documents :.
's password:
Label.pdf 100% 3672KB 282.5KB/s 00:13
< 100% 10KB 9.8KB/s 00:00
拷贝完成后,你会在⽬标服务器中到⼀个名为“documents”的⽂件夹,其中就是所拷贝的所有⽂件。“documents”是系统⾃动创建的⽂件夹。
禁⽤进度条和警告/诊断信息
如果你不想从SCP中看到进度条和警告/诊断信息,你可以⽤“-q”参数来静默它们,举例如下。
复制代码
代码如下:
pungki@mint ~/Documents $ scp -q Label.pdf :.
's password:
pungki@mint ~/Documents $
正如你所看到的,在你输⼊密码之后,没有任何关于SCP进度的消息反馈。进度完成后,你也看不到任何提⽰。
⽤SCP通过代理来拷贝⽂件
代理服务器经常⽤于办公环境,SCP⾃然是没有经过代理⽅⾯的配置的。当你的环境正在使⽤代理,那么你就必须要“告
诉”SCP与代理关联起来。
场景如下:代理的地址是10.0.96.6,端⼝是8080。该代理还实现了⽤户认证功能。⾸先,你需要创建⼀个“~/.ssh/config”⽂件,其次把以下命令输⼊进该⽂件。
复制代码
代码如下:
ProxyCommand /usr/bin/corkscrew 10.0.96.6 8080 %h %p ~/.ssh/proxyauth
接着你需要创建⼀个同样包括以下命令的“~/.ssh/proxyauth”⽂件。
复制代码
代码如下:
myusername:mypassword
然后你就可以像往常⼀样使⽤SCP了。
请注意corkscrew可能还没有安装在你的系统中。在我的Linux Mint中,我需要⾸先先⽤标准Linux Mint安装程序来安装它。
复制代码
代码如下:
$ apt-get install corkscrew
对于其它的⼀些基于yum安装的系统,⽤户能⽤以下的命令来安装corkscrew。
复制代码
代码如下:
# yum install corkscrew
还有⼀点就是因为“~/.ssh/proxyauth”⽂件中以明⽂的格式包含了你的“⽤户名”和“密码”,所以请确保该⽂件只能你来查看。选择不同的ssh_config⽂件
对于经常在公司⽹络和公共⽹络之间切换的移动⽤户来说,⼀直改变SCP的设置显然是很痛苦的。如果我们能放⼀个保存不同配置的ssh_config⽂件来匹配我们的需求那就很好了。
以下是⼀个简单的场景
代理是被⽤来在公司⽹络但不是公共⽹络并且你会定期切换⽹络时候使⽤的。
复制代码
代码如下:
pungki@mint ~/Documents $ scp -F /home/pungki/proxy_ssh_config Label.pdf
:.
's password:
Label.pdf 100% 3672KB 282.5KB/s 00:13
默认情况下每个⽤户会把“ssh_config”⽂件放在“~/.ssh/config“路径下。⽤兼容的代理创建⼀个特定的“ssh_config”⽂件,能让你切换⽹络时更加⽅便容易。
当你处于公司⽹络时,你可以⽤“-F”参数,当你处于公共⽹络时,你可以忽略掉“-F”参数。
以上就是关于SCP的全部内容了,你可以查看SCP的man页⾯来获取更多内容,请随意留下您的评论及建议。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论