linux scp免密传输
Linux SCP传输文件免密配置
SSH免密登录基于非对称加密和密钥认证机制,通过公钥和私钥的配对验证实现安全登录,无需输入密码。
- 公钥和私钥是数学关联的,但无法通过公钥反推私钥。
- 私钥是身份的唯一标识,泄露会导致安全风险。
- 生成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
20Generating 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。
- 将公钥复制到远程服务器
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
5cat ~/.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
文件中,从而实现从本地到远程服务器的免密登录。
这样,就可以向目标机器免密传输数据。
- 使用scp复制到远程服务器
scp -r ./wwwroot [email protected]:/home/opc/
- 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" |
cat ~/.ssh/id_rsa.pub
- 读取本地计算机上的公钥文件内容(
id_rsa.pub
)。
- 读取本地计算机上的公钥文件内容(
|
(管道符)- 将前一个命令的输出(公钥内容)通过管道传递给下一个命令。
ssh username@remote_host
- 通过SSH连接到远程服务器(
remote_host
),使用用户名username
登录。
- 通过SSH连接到远程服务器(
"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
)直接登录远程服务器,无需输入密码。 - 安全加固:通过设置严格的目录和文件权限(
700
和600
),防止未授权访问。