====== 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'',设置此项为no PasswordAuthentication no
* 重启 ''sshd'' 服务
* 欢迎词:动态生成后位于''cat /run/motd.dynamic''.
* 彩色标题词:可先安装''sudo apt install figlet toilet'',再编辑''/etc/update-motd.d/00-header'', 添加 ''toilet -f standard -F metal oakfire''。
===== Tips =====
* 如果 openssh 版本[[https://www.openssh.com/txt/release-8.8|不低于 8.8]], 有可能[[https://www.openssh.com/txt/release-8.2|禁用 RSA-1 算法]]导致 key 失效,详见 [[https://confluence.atlassian.com/bitbucketserverkb/ssh-rsa-key-rejected-with-message-no-mutual-signature-algorithm-1026057701.html| 此说明]], 在参数添加 ''-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 的方法: [[https://developer.github.com/guides/using-ssh-agent-forwarding/|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 有个[[http://stackoverflow.com/questions/17846529/could-not-open-a-connection-to-your-authentication-agent|高票解答]]能解决此问题: 执行 eval `ssh-agent -s`
===== 使用 ssh 转发端口 =====
* [[http://blog.creke.net/722.html|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\\.ssh\config'' 文件,添加
Host
ProxyCommand connect -S 127.0.0.1:1080 %h %p
其中 '''' 可为 ''*'' 表示不限目标ip, 或者可设置为特定的 ip 或域名,比如 ''github.com''; 第二行的''127.0.0.1:1080'' 可改为实际代理地址; ''connect''为git mingw64自带, 所以在git bash 里可用, 如果没有则需要自行下载 connect.exe 放到 PATH 路径。
* Linux:编辑 ''~/.ssh/config'', 添加
Host
ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
* 如果只是单次使用,可直接在执行命令时添加: ''ssh @ -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