一 环境准备
在Linux中使用ssh-agent实现免密登录,步骤如下:
1. 启用ssh-agent:执行`eval `ssh-agent``获取Agent pid。
2. 添加私钥:使用`ssh-add`将私钥交给ssh-agent保管。
3. 编辑配置文件:修改`/etc/ssh/ssh_config`,设置`ForwardAgent yes`让ssh-agent能转发。
4. 设置开机自启:为避免每次手动运行,可在`/etc/profile.d`下创建`ssh-agent.sh`文件,写入相关启动脚本。
完成上述步骤后,即可实现ssh免密登录,且支持GUI环境。
二 使用ssh-agent实现免密登录
在现代的服务器管理中,SSH(Secure Shell)是一种常用的远程登录工具。为了提高安全性及便捷性,使用密钥对进行免密登录显得尤为重要。本文将详细介绍如何通过`ssh-agent`实现多台机器的免密登录,并提供几个具体的案例。
案例一:管理个人多台服务器
假设你是一名系统管理员,负责管理公司的多台服务器。为了方便管理,你需要实现从本地机器免密登录到这些服务器。首先,在本地机器上生成一对SSH密钥,包括公钥和私钥。打开终端,执行以下命令:
```
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
命令解释:
- `-t rsa`:指定使用RSA加密算法(默认选项)。
- `-b 4096`:指定密钥长度为4096位(默认为2048位,更长的密钥更安全)。
- `-C "your_email@example.com"`:添加注释,通常为你的邮箱地址。
执行上述命令后,系统会提示你输入保存密钥的文件路径,一般情况下直接按回车键使用默认路径(`~/.ssh/id_rsa`)即可。随后会要求你输入一个密码短语(passphrase),用于保护私钥。如果不需要密码短语,直接按回车键跳过。
生成密钥对后,需要将私钥添加到`ssh-agent`中。`ssh-agent`是一个密钥管理器,负责在需要时提供私钥进行身份验证。首先启动`ssh-agent`:
```
$ eval "$(ssh-agent -s)"
```
这会启动`ssh-agent`进程并设置相应的环境变量。然后将私钥添加到`ssh-agent`中:
```
$ ssh-add ~/.ssh/id_rsa
```
此时,系统会提示你输入之前设置的密码短语。输入后,私钥便被添加到`ssh-agent`中。
接下来,需要将本地的公钥分发到远程服务器上。可以使用`ssh-copy-id`命令简化这一过程:
```
$ ssh-copy-id -i ~/.ssh/id_rsa user@remote_host
```
命令执行过程中会要求输入远程主机的密码。输入后,公钥会被追加到远程主机的`~/.ssh/authorized_keys`文件中。
如果`ssh-copy-id`命令不可用,也可以手动完成这一步骤。首先将公钥复制到远程服务器:
```
$ scp ~/.ssh/id_rsa.pub user@remote_host:~
```
然后登录到远程服务器,将公钥追加到`authorized_keys`文件中:
```
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```
确保远程服务器的`/etc/ssh/sshd_config`文件配置正确,允许公钥认证。打开该文件并确保以下行未被注释:
```
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile.ssh/authorized_keys
```
如果需要修改配置,记得重启SSH服务使配置生效:
```
# RHEL/CentOS
$ service sshd restart
# Ubuntu/Debian
$ service ssh restart
```
现在可以尝试使用`ssh`命令登录远程服务器,无需再输入密码:
```
$ ssh user@remote_host
```
如果一切配置正确,你应该能够直接登录到远程服务器。
案例二:开发团队共享服务器
在一个开发团队中,多个开发者需要访问同一台服务器来进行项目开发。为了方便团队协作,可以使用`ssh-agent`实现团队成员之间的免密登录。首先,团队成员各自在本地机器上生成密钥对,并按照上述方法将公钥分发到服务器上。
为了在多个shell窗口中共享同一个`ssh-agent`进程,可以将`ssh-agent`的环境变量保存到一个文件中,并在需要时加载该文件。首先,在`/etc/profile.d/`目录下新建一个脚本文件`ssh-agent.sh`:
```
$ sudo gedit /etc/profile.d/ssh-agent.sh
```
编辑该文件并添加以下内容:
```
#!/bin/sh
if [ -f ~/.agent.env ]; then
. ~/.agent.env > /dev/null
if! kill -0 $SSH_AGENT_PID > /dev/null 2>&1; then
echo "Stale agent file found. Spawning new agent…"
eval "$(ssh-agent | tee ~/.agent.env)"
ssh-add
fi
else
echo "Starting ssh-agent…"
eval "$(ssh-agent | tee ~/.agent.env)"
ssh-add
fi
```
保存并关闭文件。这样,每次打开新的终端窗口时,脚本会自动检测并启动`ssh-agent`,或者加载已有的环境变量,从而实现多进程共享。
通过上述步骤,开发团队成员便可以方便地实现免密登录,提高团队协作效率。
三 多进程共享ssh-agent
为了在多个shell窗口中共享同一个`ssh-agent`进程,可以将`ssh-agent`的环境变量保存到一个文件中,并在需要时加载该文件。首先,在`/etc/profile.d/`目录下新建一个脚本文件`ssh-agent.sh`:
```
$ sudo gedit /etc/profile.d/ssh-agent.sh
```
编辑该文件并添加以下内容:
```
#!/bin/sh
if [ -f ~/.agent.env ]; then
. ~/.agent.env > /dev/null
if! kill -0 $SSH_AGENT_PID > /dev/null 2>&1; then
echo "Stale agent file found. Spawning new agent…"
eval "$(ssh-agent | tee ~/.agent.env)"
ssh-add
fi
else
echo "Starting ssh-agent…"
eval "$(ssh-agent | tee ~/.agent.env)"
ssh-add
fi
```
保存并关闭文件。这样,每次打开新的终端窗口时,脚本会自动检测并启动`ssh-agent`,或者加载已有的环境变量,从而实现多进程共享。
通过上述步骤,你便成功配置了使用`ssh-agent`实现免密登录,极大地提升了工作效率和安全性。




