Linux命令(30)——scp命令

1.简介

scp(secure copy)命令是一个基于SSH安全的进行远程文件拷贝命令,用于在Linux下进行远程拷贝文件,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp支持对传输的数据进行加密。

2.命令格式

scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] 
    [[user@]host1:]file1 ... [[user@]host2:]file2

3.选项说明

-1:使用ssh协议版本1;
-2:使用ssh协议版本2;
-4:使用ipv4;
-6:使用ipv6;
-B:以批处理模式运行,阻止scp询问口令;
-C:使用压缩,将-C标志传递给ssh,从而打开压缩功能;
-c [cipher]:使用指定的秘钥对传输的文件进行加密;
-F [ssh_config]:指定ssh配置文件;
-i [identity_file]:从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh;
-l [limit]:指定宽带限制;
-o [ssh_option]:指定使用的ssh选项,可以使用ssh_config中使用的ssh选项;
-P [port]:指定远程主机的端口号;
-p:保留文件的最后修改时间,最后访问时间和权限模式;
-q:Quiet mode,不显示复制进度以及来自ssh的警告和诊断消息;
-r:以递归方式复制整个目录;
-S [program]:指定加密传输时所使用的程序。此程序必须能够理解ssh的选项;
-v:使用冗余模式,使scp和ssh打印调试信息以及进度。

注意事项: (1)scp返回0成功,>0失败; (2)使用scp在不同主机之间进行文件传输,需要确保两台设备都开启了ssh远程登录服务,且两台设备能互相通信; (3)使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的。

4.常用示例

(1)远程主机之间,使用scp拷贝多个文件。

方法一:将多个文件放在同一个目录中,使用scp -r 来拷贝,参考如下代码:

scp -r uername@sourceHostName:sourcedir username@destinationHostName:destinationdir

方法二: 将多个文件或者目录使用tar打包后作为单个文件传输。

方法三: scp支持同时拷贝多个文件的功能,示例如下:

scp file1  file2 remote_username@remote_ip:remote_folder 

(2)从本地复制文件到远程。 命令格式:

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

第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名; 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;

应用实例:

scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music 
scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music/001.mp3 
scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music 
scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music/001.mp3 

(3)使用scp复制目录。 命令格式:

scp -r local_folder remote_username@remote_ip:remote_folder 
或者 
scp -r local_folder remote_ip:remote_folder

第1个指定了用户名,命令执行后需要再输入密码; 第2个没有指定用户名,命令执行后需要输入用户名和密码;

应用实例:

scp -r /home/space/music/ root@www.runoob.com:/home/root/others/ 
scp -r /home/space/music/ www.runoob.com:/home/root/others/ 

上面命令将本地 music 目录复制到远程 others 目录下。

(4)从远程复制到本地。 从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下实例 应用实例:

scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3 
scp -r www.runoob.com:/home/root/others/ /home/space/music/

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

#scp 命令使用端口号 4588
scp -P 4588 remote@www.runoob.com:/usr/local/sin.sh /home/administrator

(5)使用expect和scp实现不同主机之间文件的自动传输。 脚本如下:

#!/usr/bin/expect
set timeout 5
spawn scp dablelv@172.25.44.22:/yourpath/yourfile root@10.130.89.104:/destinationpath
expect "dablelv@172.25.44.22's password:"
send "123456\n"
expect "root@10.130.89.104's password:"
send "123456\n"
interact eof

脚本解释: 第一行:#!/usr/bin/expect 指明该脚本由expect来解析。这里的expect其实和linux下的bash、Windows下的cmd.exe是一类东西,都是可执行程序,也可用于脚本的解析器。expect的主要作用是解析自动交互的脚本,比如实现ssh的自动登录,无需手动输入密码等。

第二行:set timeout 5 用于设置expect的expect命令的等待时间为5秒,如果expect等待的值在5秒内没有出现在标准输出,那么expect脚本继续执行。expect的默认timeout为10s。

第三行:spawn scp dablelv@172.25.44.22:/yourpath/yourfile。spawn是expect的内置命令,不是Linux可执行程序,使用which spawn 是查不到spawn所在路径的。这个就好比cd是shell的内建命令,离开shell,就无法执行cd一样。 它主要的功能是给ssh运行进程加个壳,用来传递交互指令。 它主要的功能是给后面需要执行的命令加个壳,用来传递交互指令。

第四行:expect "dablelv@172.25.44.22's password:" expect命令也是expect的内建命令,其作用就是等待标准输出出现指定的值,如果有则立即返回,向下执行;否则就一直等待,等待的最长时间由上面的set timeout来指定。

第五行:send "123456\n"就是在expect等待到指定的值之后向标准输出发送的值,这里就是执行交互动作,与手工输入密码的动作等效。效果上跟用户手动在终端上输入123456之后敲一个回车一样。

第六、七行实现的功能同第五六行,因为scp需要登录到两个主机实现文件的网络传输,所以这里是登录第二台主机需要输入的密码。

第八行:interact eof 表示expect脚本执行结束。执行完成上述命令后,此时Expect会把控制权交给控制台,这个时候就变回手工操作。如果是使用ssh登录其它主机的话,需要保持在交互状态,那么此时需要interact,如果没有这一句登录完成后会立刻退出,而不是留在远程终端上。如果你只是登录过去执行一段命令就退出,可将其改为expect eof

如果出现 “: no such file or directory 这样的错误,很可能是因为在本地Windows环境编辑,上传到Linux下执行因文件格式不同导致的,可使用vi或者vim在末行模式使用:set ff来查看文件格式,如果是dos格式的话,那么需要使用:set ff=unix 来改变文件格式。


参考文献

[1]man scp [2]Linux命令大全.scp命令 [3]Linux scp命令 [4]expect简单教程

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

《Redis设计与实现》读书笔记(十五) ——Redis AOF持久化原理与实现

《Redis设计与实现》读书笔记(十五) ——Redis AOF持久化原理与实现 (原创内容,转载请注明来源,谢谢) 一、概述 AOF(Append OnFil...

3545
来自专栏我是攻城师

kafka版本不一致导致的一个小问题(二)

5428
来自专栏零基础使用Django2.0.1打造在线教育网站

零基础使用Django2.0.1打造在线教育网站(十二):错误信息提示

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

1841
来自专栏HaHack

化繁为简的企业级 Git 管理实践(一):多分支子模块依赖管理

1542
来自专栏Java帮帮-微信公众号-技术文章全总结

Zookeeper实现参数的集中式管理【面试+工作】

应用项目中都会有一些参数,一般的做法通常可以选择将其存储在本地配置文件或者内存变量中;对于集群机器规模不大、配置变更不是特别频繁的情况下,这两种方式都能很好的解...

1533
来自专栏玄魂工作室

Hacker基础之Linux篇:基础Linux命令一

这一部分主要是讲解Linux常用命令工具,比如文件管理,文本处理等等,主要是为了让读者用最少的实践掌握和熟练应用基本的Linux操作,对于每个命令的举例,尽量做...

2967
来自专栏决胜机器学习

Redis专题(一)——Redis基本概述与安装配置

Redis专题(一) ——Redis基本概述与安装配置 (原创内容,转载请注明来源,谢谢) 一、特性 1、存储方式 Redis采用Key-Va...

3224
来自专栏自动化测试实战

flask第十四篇——重定向

2856
来自专栏极客编程

node.js + mongodb 原

想写博客很长时间了,因为一直身患懒癌,所以一直拖到了现在。markdown的语法也是刚刚学,试验一下效果 好了不说了,直接上干货了。 -------------...

1494
来自专栏钟绍威的专栏

linux常用命令之文件管理默认情况选项参数注意用法选项用法选项用法参数注意用法选项用法选项注意用法选项注意

LS ls:list directory contents 默认情况 默认情况下显示的是mtime 选项 -a 列出全部文件及目录包括隐藏的 -l 列出详细...

1769

扫码关注云+社区

领取腾讯云代金券