Linux命令:scp
转⾃:恋猫⼤鲤鱼
dablelv.blog.csdn/article/details/78627879
1. 简介
  scp(secure copy) 命令是⼀个基于 SSH 安全的远程拷贝命令,⽤于在 Linux 下远程拷贝⽂件,和它类似的命令有 cp,不过 cp 只是在本机进⾏拷贝,不能跨服务器,⽽且 scp 还⽀持对传输的数据进⾏加密。
2. 命令格式
scp [-1246BCpqrv] [-c cipher] [-F ssh-config] [-i identity_file] [-l limit] [[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 选项
-P PORT:
指定远程主机的端⼝号
-p:
保留⽂件的最后修改时间,最后访问时间和权限模式
-q:
静默模式,不显⽰复制进度及来⾃ ssh 的警告和诊断信息
-r:
以递归⽅式复制整个⽬录
-S PROGRAM:
指定加密传输时所使⽤的程序
-v:
使⽤冗余模式,使 scp 和 ssh 打印调试信息及进度
注意事项:
  1. scp 成功返回0,失败 > 0
    2. 使⽤ scp 在不同主机之间进⾏⽂件传输,需要确保两台设备都开启了 ssh,且两台设备能相互通信
  3. 要有对应的权限
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:/home/root/others/music
scp /home/space/music/1.mp3 root@www.runoob:/home/root/others/music/001.mp3
scp /home/space/music/1.mp3 www.runoob:/home/root/others/music
scp /home/space/music/1.mp3 www.runoob:/home/root/others/music/001.mp3linux登录命令
(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:/home/root/others/
scp -r /home/space/music/ www.runoob:/home/root/others/
  上⾯命令将本地 music ⽬录复制到远程 others ⽬录下。
(4)从远程复制到本地。
  从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下实例
  应⽤实例:
scp root@www.runoob:/home/root/others/music /home/space/music/1.mp3
scp -r www.runoob:/home/root/others/ /home/space/music/
  **说明:**如果远程服务器防⽕墙有为scp命令设置了指定的端⼝,我们需要使⽤ -P 参数来设置命令的端⼝号,命令格式如下:
#scp 命令使⽤端⼝号 4588
scp -P 4588 remote@www.runoob:/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下的是⼀类东西,都是可执⾏程序,也可⽤于脚本的解析器。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来改变⽂件格式

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。