一、生成密钥 ssh-keygen
ssh-keygen 是安全外壳( SSH )协议套件的标准组件,用于生成,管理和转换身份验证密钥。
参数说明
-b bits 指定要创建的秘钥中的位数,默认 2048 位。值越大,密码越复杂
-C comment 注释,在 id_rsa.pub 中末尾
-t rsa/dsa等 指定要创建的秘钥类型,默认为 RSA
-f filename 指定公私钥的名称,会在 $HOME/.ssh 目录下生产私钥 filename 和公钥 filename.pub
-N password 指定使用秘钥的密码,使得多人使用同一台机器时更安全
常用命令生成公私钥,默认文件为 ~/.ssh/id_rsa
ssh-keygen -t rsa -b 4096 -C "your_email@moneyslow.com"
二、管理秘钥 ssh-agent 和 ssh-add
ssh-agent 和 ssh-add是安全外壳(SSH)协议套件的标准组件,用于管理私钥。一般情况下我们使用不带密码的 id_rsa 作为我们的默认私钥,此时是没必要启动 ssh-agent 的。当我们碰到以下两种情况则需要它:
使用不同的秘钥连接到不同的主机时,需要手动指定对应的秘钥。(ssh-agent 帮我们选择对应的秘钥进行认证)
当私钥设置了密码,而我们又需要频繁的使用私钥进行认证。(ssh-agent 帮我们免去重复输入密码)
有关代理常用命令
# 启动代理
eval `ssh-agent`
# 关闭代理
ssh-agent -k
# 在 ~/.bashrc 中加入以下来实现登陆自动启动 ssh-agent,退出自动 kill 掉程序
eval $(ssh-agent -s) > /dev/null
trap 'test -n "$SSH_AGENT_PID" && eval `/usr/bin/ssh-agent -k` > /dev/null' 0
# 查看代理中的私钥
ssh-add -l
# 查看代理中私钥对应的公钥
ssh-add -L
# 移除指定的私钥
ssh-add -d /path/of/key/key_name
# 移除所有的私钥
ssh-add -D
三、发送公钥 ssh-copy-id
ssh-copy-id 是一个用来将公钥放到服务器上的脚本。它通过 SSH 密码登陆远程服务器,并将指定的公钥放到远程服务器 $HOME/.ssh/authorized_keys 中。这个操作也可以先登陆到服务器中,然后通过 vi 等文本编辑命令向 $HOME/.ssh/authorized_keys 中加入允许登陆的公钥。不过对于云服务器可以在启动服务器时在页面上操作绑定公钥,这样更安全些(阿里云和腾讯云默认关闭秘钥登陆 PasswordAuthentication no )。特别注意的是,千万别在公共的网络中通过密码登陆远程服务器,而秘钥登陆没有问题。
# 发送公钥的两种方式(等价)
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
四、ssh登陆方法
# 登陆目标服务器( 192.168.10.10 )
ssh -p 58422 user@192.168.10.10
# 通过跳板机登陆目标服务器( 192.168.10.10 )
ssh -p 58422 user@jumper.example.com ssh user@192.168.10.10
# 端口映射
ssh -p 58422 user@jumper.example.com -fNL 5433:192.168.10.10:5432 -N
五、ssh登陆方法(通过配置文件 $HOME/.ssh/config 来进行简化)
vi $HOME/.ssh/config ,内容如下:
# 通用配置,所有配置都使用
Host *
AddKeysToAgent yes # 将私钥添加到ssh-agent中
UseKeychain yes # 保存密码到agent中
ServerAliveInterval 10 # 连接心跳间隔10s
ServerAliveCountMax 3 # 重连次数为3
# target配置
Host target
HostName 192.168.10.10
User user
Port 58422
IdentityFile ~/.ssh/id_rsa
# 跳板机配置
Host jumper
HostName jumper.example.com
User user
Port 58422
IdentityFile ~/.ssh/id_rsa
Host jump_target
HostName 192.168.10.10
User user
Port 22
IdentityFile ~/.ssh/id_rsa
ProxyJump jumper # ProxyJump比ProxyCommand适用范围更广
#ProxyCommand ssh user@jumper -W %h:%p 2>/dev/null
LocalForward 5433 localhost:5432 # 本地5433映射到jump_target的5432
第四步就简化为:
# 登陆目标服务器( 192.168.10.10 )
ssh target
# 通过跳板机登陆目标服务器( 192.168.10.10 )
ssh jump_target
# 端口映射
## 登陆时通过 LocalForward 配置
ssh jump_target
## 使用-L来实现本地端口映射
ssh -C -N -g -L 5433:127.0.0.1:5432 jump_target