这是本文档旧的修订版!
ssh
Ubuntu
- 默认安装有客户端
openssh-client
, 服务端需手动安装sudo apt-get install openssh-server
; - 服务名
ssh
,服务进程名sshd
- 服务端配置文件
/etc/ssh/sshd_config
; 客户端配置文件/etc/ssh/ssh_config
- 通过 key 登陆:
- 客户端生成私钥与公钥
ssh-keygen -t rsa
- 把公钥加到服务端的
~/.ssh/authorized_keys
文件里, 或在客户端使用命令:ssh-copy-id -i ~/.ssh/id_rsa.pub username@hostip
- 禁用密码登录:
- 编辑
/etc/ssh/sshd_config
,设置此项为noPasswordAuthentication no
- 重启
sshd
服务
Tips
- 如果 openssh 版本不低于 8.8, 有可能禁用 RSA-1 算法导致 key 失效,详见 此说明, 在参数添加
-vvvv
开启日志的ssh 中可见debug1: send_pubkey_test: no mutual signature algorithm
, 解决办法是用 ed25519 来生成公私钥
ssh-keygen -t ed25519 -C "your_email@example.com"
Using SSH agent forwarding
- 远程使用 SSH 时,直接使用本地的 key 的方法: using ssh agent forwarding
- 假设 A ⇒ B ⇒ C,现在要达到在 B ⇒ C 时使用 A 的 key.
- 要求 A 的
ssh_config
开启选项ForwardAgent
- 要求 A 的
ssh-agent
在运行,并有 key , 可用ssh-add -L
检查, 如果没有,则添加ssh-add yourkey
- 要求 B 的
sshd_config
开启选项AllowAgentForwarding
- A ⇒ B 时,使用
ssh -A example.com
来手动 agent forwarding; - 或者在配置里配置登陆 B 时自动开启 agent forwarding;
Host example.com ForwardAgent yes
- 如果在 windows 上使用 ssh 登陆到 A,然后想进行 A ⇒ B ⇒ C 的 agent forwarding, 在
ssh-add
这一步时会提示一个错误(忘了叫什么),stackoverflow 有个高票解答能解决此问题: 执行eval `ssh-agent -s`
使用 ssh 转发端口
- SSH隧道与端口转发及内网穿透
ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host ssh -C -f -N -g -D listen_port user@Tunnel_Host
通过代理进行 ssh 访问
- Windows: 编辑
C:\Users\<username>\.ssh\config
文件,添加Host <host> ProxyCommand connect -S 127.0.0.1:1080 %h %p
其中
<host>
可为*
表示不限目标ip, 或者可设置为特定的 ip 或域名,比如github.com
; 第二行的127.0.0.1:1080
可改为实际代理地址;connect
为git mingw64自带, 所以在git bash 里可用, 如果没有则需要自行下载 connect.exe 放到 PATH 路径。 - Linux:编辑
~/.ssh/config
, 添加Host <host> ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
- 如果只是单次使用,可直接在执行命令时添加:
ssh <user>@<host> -o “ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p”
Generate RSA key
# 生成 RSA 私钥(传统格式的) openssl genrsa -out rsa_private_key.pem 1024 # 生成 RSA 公钥 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem # 将传统格式的私钥转换成 PKCS#8 格式的 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt