Linux(Mac OS) ssh如何免密码登陆

内容分享11小时前发布
0 0 0

思路:为了让 scp 和 ssh 自动执行,也就是ssh与scp免密码操作,需要在本地配置好 SSH 密钥对,并将公钥添加到服务器的 ~/.ssh/authorized_keys 文件中,这样运行时就无需手动输入密码了。

要生成 SSH 密钥对(公钥和私钥),你需要使用 ssh-keygen 工具,这个工具在大多数 Unix/Linux/macOS 系统以及安装了 Git Bash 的 Windows 系统上都是默认可用的。

以下是生成密钥对的详细步骤:

生成 SSH 密钥对

1. 执行生成命令

打开你的终端(Terminal 或 Git Bash),输入以下命令:

ssh-keygen -t rsa -b 4096
  • -t rsa: 指定密钥类型为 RSA。
  • -b 4096: 指定密钥长度为 4096 位,这是目前推荐的安全长度(默认是 3072 位)。

2. 交互式提示

运行命令后,系统会要求你输入几个信息:

a. 密钥存储位置

Enter file in which to save the key (/Users/youruser/.ssh/id_rsa): 
  • 推荐操作: 直接按 Enter 键使用默认位置 (~/.ssh/id_rsa)。如果你之前已经有密钥,系统会提示你是否覆盖,如果你不确定,最好输入一个新文件名(例如 ~/.ssh/id_rsa_myproject)。

b. 设置密码(Passphrase)

Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
  • 推荐操作: 强烈提议设置一个安全的密码。这个密码会在每次使用私钥时要求输入,为私钥提供额外的保护。如果你不想每次都输入密码(例如在自动化脚本中),可以留空直接按 Enter,但这样做会降低安全性。

3. 结果

生成完成后,你会看到类似这样的输出:

Your identification has been saved in /Users/youruser/.ssh/id_rsa.
Your public key has been saved in /Users/youruser/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:.................................... youruser@yourhostname

你的密钥对目前已经生成并存储在默认的 ~/.ssh/ 目录下:

  • 私钥文件 (Private Key): id_rsa (或你指定的名称)。这是你的身份证明,必须严格保密,绝对不能共享!
  • 公钥文件 (Public Key): id_rsa.pub (或你指定的名称后面加 .pub)。这是你可以安全共享给服务器的文件。

部署密钥(将公钥添加到服务器)

要使用 SSH 密钥对进行免密或密码登录,你需要将 公钥 (id_rsa.pub) 的内容添加到远程服务器上的特定文件。

1. 拷贝公钥内容

你可以使用 cat 命令来查看并复制公钥的全部内容:

cat ~/.ssh/id_rsa.pub

输出会是一长串以 ssh-rsa 开头、以你的用户名和主机名结尾的文本。

2. 添加到服务器

有两种主要方法将公钥添加到远程服务器:

方法 A: 使用 ssh-copy-id (推荐)

这是最简单、最安全的方法,如果你的本地系统支持,请优先使用:

ssh-copy-id user@your_server_ip
# 如果需要指定公钥和端口
ssh-copy-id -i /home/user/.ssh/id_my_server.pub -p 2222 deploy_user@192.168.1.100
  • 它会要求你输入一次服务器的密码,然后自动将你的公钥内容追加到服务器的 ~/.ssh/authorized_keys 文件中。

方法 B: 手动追加

如果你没有 ssh-copy-id,可以通过 SSH 手动操作:

1、登录服务器: 使用密码登录到你的服务器。

ssh user@your_server_ip

2、创建目录和文件(如果不存在):

mkdir -p ~/.ssh 
chmod 700 ~/.ssh 
touch ~/.ssh/authorized_keys 
chmod 600 ~/.ssh/authorized_keys

3、追加公钥: 将你在本地复制的公钥内容粘贴到服务器的 ~/.ssh/authorized_keys 文件的末尾。

4. 测试连接

目前你应该可以在不输入密码(但如果设置了 Passphrase,需要输入 Passphrase)的情况下连接到服务器了:

ssh user@your_server_ip

这个密钥对就可以用于你脚本中的 scp 和 ssh 命令了。

如果还是需要输入命令

当你使用 ssh-copy-id 成功设置公钥后,依旧需要输入密码(或 Passphrase)才能登录,一般有以下几个缘由。请按照以下步骤进行排查:

SSH 免密登录排查步骤

1. 检查私钥的 Passphrase (首要缘由)

如果你在生成密钥对时设置了 Passphrase(密码),那么在使用私钥连接时,你就必须输入这个 Passphrase。这是密钥的安全机制,不是登录密码。

  • 解决方案:
    • 方法一 (推荐): 使用 ssh-agent 来管理你的密钥。你需要先启动 ssh-agent,然后用 ssh-add 将私钥加载到代理中。这样在你本次会话期间,只需要输入一次 Passphrase。(极有可能是未对下方命令进行设置)
# 1. 启动 ssh-agent (如果尚未启动) 
eval "$(ssh-agent -s)" 
# 2. 将私钥添加到 agent,此时会要求输入 
Passphrase ssh-add ~/.ssh/id_my_server
    • 方法二 (不推荐用于自动化): 如果你的私钥没有 Passphrase,那么登录时就不会提示输入。如果你需要完全自动化,并且可以接受安全风险,你可以重新生成一个没有 Passphrase 的密钥对。

2. 检查 SSH 命令是否指定了正确的私钥

如果你生成密钥时使用了非默认的文件名(例如 id_my_server 而不是默认的 id_rsa),你在尝试连接时必须使用 -i 选项指定私钥文件。

  • 测试命令:
ssh -i ~/.ssh/id_my_server -p 2222 deploy_user@192.168.1.100
如果你没有指定 -i,SSH 客户端会默认尝试使用 id_rsa,从而连接失败并回退到密码验证。

3. 检查服务器端的权限和配置

尽管 ssh-copy-id 会自动设置权限,但手动检查一下总是好的。服务器上的 SSH 服务超级严格地要求权限。

在远程服务器 192.168.1.100 上,使用 deploy_user 登录后,检查以下权限:

目录/文件

所属用户

权限 (chmod)

~/.ssh

deploy_user

700 (d rwx——)

~/.ssh/authorized_keys

deploy_user

600 (- rw——-)

检查方法:

# 在服务器上执行
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys

4. 检查服务器端的 sshd 配置

检查服务器的 SSH 配置文件(一般是 /etc/ssh/sshd_config),确保以下配置项是开启的:

# 检查这些配置,确保它们不是注释状态(没有 # 开头)并且是 yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

如果你修改了 sshd_config 文件,必须重启 SSH 服务才能生效:

sudo systemctl restart sshd
# 或者
sudo service sshd restart

5. 查看详细的 SSH 调试信息

使用 -v 选项可以查看 SSH 客户端连接时的详细过程,这一般能帮你定位问题是出在本地客户端还是远程服务器:

ssh -v -i ~/.ssh/id_my_server -p 2222 deploy_user@192.168.1.100

观察输出中关于 “Authentication” 的部分,如果看到类似 Trying private key:
/home/user/.ssh/id_my_server 和 Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password 的信息,说明客户端正在尝试使用密钥。如果它最终回退到 password 认证,调试信息会指出缘由。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...