SSH各种操作

SSH使用HTTP代理

一句话命令行形式:

ssh -o "ProxyCommand=nc -X connect -x 代理主机:代理端口 %h %p" 目标主机 -p 目标SSH端口

配置文件形式 ~/.ssh/config

1
2
3
4
5
Host 目标机名称
HostName 目标机IP
Port 22
User 登录用户名
ProxyCommand nc -X connect -x 代理主机:代理端口 %h %p

通过跳板机登录SSH (多跳登录)

一句话命令行形式

ssh -J user@<JumpHost:JumpPort> user@<TargetHost:TargetPort>

配置文件形式

1
2
3
4
5
6
7
8
9
10
Host 跳板机
HostName 跳板机IP
Port 22
User 跳板机登录用户名

Host 目标机名称
HostName 目标机IP, 如果登录跳板机后目标机在内网则写内网IP.
Port 22
User 登录用户名
ProxyJump 跳板机

端口转发 (SSH隧道)

端口转发会引起安全问题, 企业IT部门可能会禁止使用.

正向端口转发: listen在本地, 请求本地相当于请求远程接口

ssh -fNL 本地端口:转发目标IP:转发目标端口 user@<host:port>

注意, 转发目标IP是相对远程主机而言的. 如果想请求远程主机本身, 使用127.0.0.1

反向端口转发: listen在远端, 请求远端相当于请求本地接口. 服务器的sshd配置(/etc/ssh/sshd_config)需包含GatewayPorts yesGatewayPorts clientspecified才能监听在0.0.0.0上, 否则只能监听在127.0.0.1上.

ssh -fNR [允许的远端来源IP:]远端监听端口:转发目标IP:转发目标端口 user@<host:port>

注意, 此处转发目标IP是相对本地主机而言的. 如果想请求本地主机, 使用127.0.0.1

-f 运行在后台

-N 不执行任何命令, 仅用于转发数据.

利用SSH搭建Socks5代理

ssh -D 本地代理监听端口 -fCN user@<host:port>

-C 进行数据压缩

SSH Agent

ForwardAgent生效时, 本机的root用户和目标机上的root用户均有权限使用此agent, 因此确保仅在可信的目标主机上启用此功能.

启动ssh-agent: eval `ssh-agent`

停止ssh-agent: eval `ssh-agent -k` , 直接kill掉对应的进程也可以. 注意清除环境变量中的SSH_AUTH_SOCKSSH_AGENT_PID.

添加私钥到agent: ssh-add 不带参数则添加默认的私钥到agent. 若要添加其他私钥, 则直接将文件名作为参数即可.

查看agent中包含的key公钥: ssh-add -L

查看agent中包含的key私钥: ssh-add -l

锁定agent: ssh-add -x

解锁agent: ssh-add -X

登录到其他主机, 并允许在对应主机上使用本机的agent:

一句话: ssh -A user@<host:port>

配置文件:

1
2
3
4
5
Host 目标机名称
HostName 目标机IP
Port 22
User 登录用户名
ForwardAgent yes

查看本机的SSH Host Key

1
sudo ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key

参考

SSH port forwarding - Example, command, server config

ssh(1) - Linux man page

ssh-add(1) - Linux man page

ssh-agent(1) - Linux man page

Using SSH agent forwarding

About the SSH host key fingerprint