在Linux环境下,ssh-add
命令是SSH (Secure Shell) 协议的一个重要组成部分,用于将私钥添加到SSH代理的密钥缓存中。这样做可以让用户在使用SSH进行远程登录或执行命令时不必每次都输入密码。ssh-add
命令可以大大简化系统管理员和频繁使用SSH服务的用户的操作流程。
Linux ssh-add命令适用的Linux版本
ssh-add
命令通常预装在大多数Linux发行版中。如果系统中未找到ssh-add
命令,可能需要安装openssh-client
或类似软件包。以下是不同发行版安装ssh-add
命令的方法:
# 基于apt的发行版(如Debian、Ubuntu、Raspbian、Kali Linux等)
sudo apt-get update && sudo apt-get install openssh-client
# 基于yum的发行版(如RedHat,CentOS 7等)
sudo yum update && sudo yum install openssh-clients
# 基于dnf的发行版(如Fedora,CentOS 8等)
sudo dnf update && sudo dnf install openssh-clients
# 基于apk的发行版(如Alpine Linux)
sudo apk add --update openssh
# 基于pacman的发行版(如Arch Linux)
sudo pacman -Syu && sudo pacman -S openssh
# 基于zypper的发行版(如openSUSE)
sudo zypper ref && sudo zypper in openssh
# 基于pkg的FreeBSD发行版
sudo pkg update && sudo pkg install openssh
# 基于pkg的OS X/macOS发行版
brew update && brew install openssh
Linux ssh-add命令的基本语法
语法格式如下:
ssh-add [选项] [文件...]
Linux ssh-add命令的常用选项或参数说明
下面是ssh-add
命令的一些常用选项和参数的说明,按字母顺序排序,为了简明扼要,只列出20个最常用的选项:
选项 | 说明 |
---|---|
-D | 删除ssh-agent中的所有私钥 |
-d | 删除指定的私钥 |
-e | 指定一个已经存在的PKCS#11共享库 |
-l | 列出ssh-agent中所有私钥的指纹 |
-L | 列出ssh-agent中所有公钥 |
-s | 添加指定的PKCS#11共享库 |
-t | 为添加的私钥设置生存周期 |
-X | 解锁ssh-agent |
-x | 锁定ssh-agent |
Linux ssh-add命令实例详解
实例1:添加默认私钥
将默认的SSH私钥(~/.ssh/id_rsa
,~/.ssh/id_dsa
,~/.ssh/id_ecdsa
,~/.ssh/id_ed25519
)添加到ssh-agent中。
[linux@bashcommandnotfound.cn ~]$ ssh-add
实例2:添加特定私钥
添加一个指定的私钥文件到ssh-agent中。
[linux@bashcommandnotfound.cn ~]$ ssh-add ~/.ssh/my_other_rsa
实例3:列出所有添加的私钥指纹
列出ssh-agent中所有加载的私钥的指纹。
[linux@bashcommandnotfound.cn ~]$ ssh-add -l
实例4:删除ssh-agent中的所有私钥
从ssh-agent中删除所有私钥。
[linux@bashcommandnotfound.cn ~]$ ssh-add -D
实例5:删除特定私钥
从ssh-agent中删除指定的私钥。
[linux@bashcommandnotfound.cn ~]$ ssh-add -d ~/.ssh/my_other_rsa
实例6:添加私钥并设置过期时间
添加一个私钥,并为其设置一个过期时间(例如,过期时间设置为1小时)。
[linux@bashcommandnotfound.cn ~]$ ssh-add -t 1h ~/.ssh/my_other_rsa
实例7:锁定ssh-agent
锁定ssh-agent以阻止对存储的私钥的访问。
[linux@bashcommandnotfound.cn ~]$ ssh-add -x
实例8:解锁ssh-agent
如果之前锁定了ssh-agent,可以使用此命令解锁,恢复对私钥的访问。
[linux@bashcommandnotfound.cn ~]$ ssh-add -X
实例9:添加多个私钥
一次性添加多个私钥到ssh-agent中。
[linux@bashcommandnotfound.cn ~]$ ssh-add ~/.ssh/id_rsa ~/.ssh/id_dsa ~/.ssh/another_key
实例10:使用PKCS#11添加智能卡
添加支持PKCS#11的智能卡模块。
[linux@bashcommandnotfound.cn ~]$ ssh-add -s /usr/lib/opensc-pkcs11.so
实例11:列出ssh-agent中的公钥
列出ssh-agent中所有已加载私钥对应的公钥。
[linux@bashcommandnotfound.cn ~]$ ssh-add -L
实例12:删除特定公钥
如果知道公钥的内容,可以直接用其内容来删除ssh-agent中的对应私钥。
[linux@bashcommandnotfound.cn ~]$ ssh-add -d <公钥内容>
实例13:添加私钥并设置确认请求
添加一个私钥到ssh-agent,并要求每次使用时都进行确认。
[linux@bashcommandnotfound.cn ~]$ ssh-add -c ~/.ssh/id_rsa
实例14:添加私钥并指定PKCS#11共享库
如果使用的私钥存储在PKCS#11兼容的设备上,可以指定共享库路径。
[linux@bashcommandnotfound.cn ~]$ ssh-add -s /path/to/pkcs11-library.so
实例15:解除添加的PKCS#11共享库
从ssh-agent中删除所有由指定PKCS#11共享库提供的私钥。
[linux@bashcommandnotfound.cn ~]$ ssh-add -e /usr/lib/opensc-pkcs11.so
实例16:显式指定ssh-agent的socket
如果有多个ssh-agent运行,或者环境变量未正确设置,可以使用SSH_AUTH_SOCK
环境变量显式指定ssh-agent的socket。
[linux@bashcommandnotfound.cn ~]$ SSH_AUTH_SOCK=/tmp/ssh-XXhjGp1060/agent.1060; export SSH_AUTH_SOCK;
[linux@bashcommandnotfound.cn ~]$ ssh-add
实例17:在脚本中添加私钥而不使用ssh-agent的提示
在自动化脚本中添加私钥时,为避免交互式密码提示,可以使用expect
工具。
#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "your_password\r"
expect "Identity added:"
实例18:添加私钥时指定密钥的评论
ssh-add
本身没有直接添加评论的选项,但可以在生成密钥时添加评论,然后用ssh-add
加载它们。
[linux@bashcommandnotfound.cn ~]$ ssh-keygen -t rsa -C "your_email@example.com"
[linux@bashcommandnotfound.cn ~]$ ssh-add ~/.ssh/id_rsa
实例19:查看ssh-agent的状态
检查ssh-agent是否正在运行,以及它是否有加载的密钥。
[linux@bashcommandnotfound.cn ~]$ ps -e | grep ssh-agent
[linux@bashcommandnotfound.cn ~]$ ssh-add -l
实例20:清除ssh-agent中的所有公钥
如果需要从ssh-agent中删除所有公钥,可以先删除所有私钥,这会同时移除其对应的公钥。
[linux@bashcommandnotfound.cn ~]$ ssh-add -D
注意事项和常见问题
- ssh-agent未运行:如果尝试使用
ssh-add
但系统提示ssh-agent未运行,可以先运行eval $(ssh-agent)
来启动ssh-agent。 - 权限问题:确保私钥文件的权限正确设置,通常应为600(即只有文件所有者有读写权限)。
- 密码提示:如果私钥被密码保护,
ssh-add
在添加时会要求输入密码。如果不希望每次都输入密码,可以考虑使用密钥无密码或使用ssh-agent的解锁功能。 - 兼容性问题:确保私钥格式与ssh-agent兼容。某些较老的私钥格式可能需要转换。
- PKCS#11支持:对于使用硬件安全模块(如智能卡)的用户,
ssh-add
支持通过PKCS#11接口与设备交互。 - 生命周期管理:使用
-t
选项可以指定私钥在ssh-agent中的生命周期。这可以增加安全性,因为即使设备被盗,私钥也会在一段时间后自动失效。
评论区