====== 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