Linux SCP传输文件免密配置

SSH免密登录基于非对称加密和密钥认证机制,通过公钥和私钥的配对验证实现安全登录,无需输入密码。

  • 公钥和私钥是数学关联的,但无法通过公钥反推私钥。
  • 私钥是身份的唯一标识,泄露会导致安全风险。
  1. 生成SSH密钥对
    ssh-keygen -t rsa -b 4096 -C "$(whoami)@$(hostname)-$(date +%Y%m%d)"
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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:5z47TSJSeLEKGt+81iGB6Yu/pZE5v7IrYT4EpqXkRsE root@instance-20230209-1931-20250604
    The key's randomart image is:
    +---[RSA 4096]----+
    |. |
    | E . |
    | . o . o |
    |.+o + o + |
    |*+ = + =S . |
    |oo= oo* oo. . |
    |.+ o=..= o.+ |
    | = o*o ..o . |
    | +**o. o+ |
    +----[SHA256]-----+

这样在/root/.ssh/目录下就有一对秘钥,公钥id_rsa.pub,私钥id_rsa。

  1. 将公钥复制到远程服务器

ssh-copy-id username@remote_host

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

手动复制

1
2
3
4
5
cat ~/.ssh/id_rsa.pub #查看本机公钥
# 追加到目标机器 授权文件中
echo "ssh-rsa AAAAB3.........qTfI0myrQ== root@instance-20250606-0334-20250607" >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/
# 查看结果
cat ~/.ssh/authorized_keys

本质是:本地生成的SSH公钥(~/.ssh/id_rsa.pub)内容追加到远程服务器的~/.ssh/authorized_keys文件中,从而实现从本地到远程服务器的免密登录。

这样,就可以向目标机器免密传输数据。

  1. 使用scp复制到远程服务器
    scp -r ./wwwroot [email protected]:/home/opc/
  1. authorized_keys说明

authorized_keys 是 SSH 密钥认证的核心文件,用于存储允许登录当前用户账户的公钥。通过将客户端的公钥添加到该文件中,服务器可以验证客户端身份,实现免密登录。

  • 存储客户端的公钥(每行一个)。
  • 当客户端尝试通过 SSH 登录时,服务器会检查此文件中的公钥是否匹配客户端提供的私钥。
  • 若匹配,则允许登录,无需输入密码。

手动copy命令分解

1
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
  1. cat ~/.ssh/id_rsa.pub

    • 读取本地计算机上的公钥文件内容(id_rsa.pub)。
  2. |(管道符)

    • 将前一个命令的输出(公钥内容)通过管道传递给下一个命令。
  3. ssh username@remote_host

    • 通过SSH连接到远程服务器(remote_host),使用用户名username登录。
  4. "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

    • 这是远程服务器上执行的一系列命令(用双引号包裹):
      • mkdir -p ~/.ssh
        如果用户主目录下的.ssh文件夹不存在,则创建它(-p确保父目录不存在时一并创建)。
      • cat >> ~/.ssh/authorized_keys
        将管道传递的公钥内容追加到远程服务器的~/.ssh/authorized_keys文件中(>>表示追加,不会覆盖原有内容)。
      • chmod 700 ~/.ssh
        设置.ssh目录的权限为700,即仅所有者可读、写、执行,其他用户无权限。
      • chmod 600 ~/.ssh/authorized_keys
        设置authorized_keys文件的权限为600,即仅所有者可读、写,其他用户无权限。

命令的作用

  • 实现免密登录:将本地公钥添加到远程服务器的authorized_keys文件后,本地计算机即可通过私钥(id_rsa)直接登录远程服务器,无需输入密码。
  • 安全加固:通过设置严格的目录和文件权限(700600),防止未授权访问。