Linux 常用命令 - scp 命令详解

scp 命令用于 Linux 两个主机之间复制文件和目录,也就是远程文件拷贝的命令。它是一种快速、高效、安全的文件传输协议。通过 SSH 连接加密传输,确保数据的安全性。scp 的全称是:Secure Copy Protocol

简易语法:

scp [可选参数] 源文件 目标文件

参数说明:(区分大小写)

  • -1 ---强制 scp 命令使用协议 ssh1
  • -2 ---强制 scp 命令使用协议 ssh2
  • -4 ---强制 scp 命令只使用 IPv4 寻址
  • -6 ---强制 scp 命令只使用 IPv6 寻址
  • -B ---使用批处理模式(传输过程中不询问传输口令或短语)
  • -c ---(小写) 指定传输数据的加密算法。
  • -C ---(大写) 强制压缩文件传输,如果已经是压缩文件时,此参数不生效,例如:.zip,.rar 等
  • -F ---指定一个替代的 ssh 配置文件 (ssh_config)
  • -i ---从指定文件中读取传输时使用的密钥文件
  • -l ---限定用户所能使用的带宽,以 Kbit/s 为单位。
  • -p ---(小写) 保留原文件的修改时间,访问时间和访问权限。
  • -P ---(大写) 注意是大写的 P, 指定数据传输用到的端口号
  • -q ---不显示传输进度条。
  • -r --- 递归复制整个目录。
  • -S ---指定加密传输时所使用的程序。
  • -v ---详细方式显示输出。会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。

实例说明:

# 复制本地主机 /root/test/ 目录及其子目录下所有的文件,到远程主机/root/test/目录下
scp -r /root/test/* root@192.168.16.96:/root/test/

# 复制远程主机 /root/test/ 目录及其子目录下所有的文件,到本地主机/root/test/目录下
scp -r root@192.168.16.96:/root/test/* /root/test/

# 如果远程主机修改过22端口,上面两条命令请加上 -P 参数
scp -r -P 8888 /root/test/* root@192.168.16.96:/root/test/
scp -r -P 8888 root@192.168.16.96:/root/test/* /root/test/

第一次连接会出现确认的提示,输入 yes 回车,然后再输入密码即可:

Linux 常用命令 - scp 命令详解插图

为 SCP 配置密钥实现免密码传输文件:

通过使用 SSH公钥 / 私钥 的方式,在进行 SCP 传输文件时无需手动输入密码,不仅提高了传输效率,还大大增强了数据传输的安全性。

条件:假设我们有两台服务器(服务器A,IP:192.168.16.100 ;服务器B,IP:192.168.16.101)
目的:实现 服务器A 和 服务器B 之间相互免密码传输文件

1、生成密钥(已经生成过的不必重复)

服务器A 和 服务器B 分别运行:

ssh-keygen -t rsa

输入上面的命令之后,一路默认直接回车即可。

root@debian:~# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:NwWh4uRLmxP0Ehx5WGCHBBu9Ol/gDrS6F9/Ch9lsl54 root@debian
The key's randomart image is:
+---[RSA 3072]----+
|    o+=*o o.     |
|     ==o.. .     |
|    . *o.   .    |
|    .=o+   .     |
|   . +*.S o      |
|    *..*.. .     |
|   . O=B   .     |
|  . . O.* o.     |
|  .o   + oE      |
+----[SHA256]-----+
root@debian:~#

注意:你用哪个用户执行,密匙就会生成在哪个用户目录的 .ssh 目录下。
示例:如果你用 root 用户登录执行上面的命令,那么密钥就会在 /root/.ssh/ 目录下生成。
另外生成的 .ssh 目录一般为隐藏目录,如果用 WinSCP 等工具,请打开显示隐藏目录的选项。

2、生成公钥,并设置权限

服务器A 和 服务器B 分别运行:

cd /root/.ssh
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh

3、服务器A 和 服务器B 互相添加公钥

把 服务器A 上的公钥添加到 服务器B 上:

ssh-copy-id root@192.168.16.101

把 服务器B 上的公钥添加到 服务器A 上:

ssh-copy-id root@192.168.16.100

到此密钥配置完毕,两台服务器之间可以通过 scp 命令相互传输文件了。

如果你只操作一台服务器,请按上面教程单独设置一个机器即可,但是最后一定要把公钥添加到要传输的服务器上。

通过密钥传输文件,手动可以执行 scp 命令,但是添加到 crontab 计划任务中就不执行了,这是因为 crontab 拿不到 ssh-agent,所以认证失败。此时我们需要添加上 -i 参数,并指定密钥路径,如下:

0 0 * * * root scp -i /.ssh/authorized_keys -r root@192.168.16.100:/test/* /test/

标签

发表评论