环境
服务端:Ubuntu 18.04.6 LTS(OpenSSH_7.6p1 Ubuntu-4ubuntu0.6, OpenSSL 1.0.2n)
常用配置
ssh server配置一般位于/etc/ssh/sshd_config,里面有很多配置项,配置项的解释可以使用man sshd详细查看。 ssh client本用户下的配置一般位于~/.ssh/config,常用配置参考后面介绍。
超时设置
不管使用iterm2或者Terminal等模拟终端时,常常会遇到过一会ssh client要不是卡住就是broken pipe类似的问题导致无法使用。这个主要是由于ssh使用tcp协议,长时间不使用后,导致超时断开。可以通过配置tcp probe解决,分为服务端配置和客户端配置,一般可以在client配置设置中加入:
shell
ServerAliveInterval 30
ServerAliveCountMax 10
上面的配置可以解释为:
vbscript
The client will wait idle for 60 seconds (ServerAliveInterval time) and, send a "no-op null
packet" to the server and expect a response. If no response comes, then it will keep trying
the above process till 10 (ServerAliveCountMax) times (600 seconds). If the server still
doesn't respond, then the client disconnects the ssh connection
上图中每隔30s客户端发送keep alive的探针保活,在数据库中一般也有类似的设置,比如postgresql中可以配置tcp_keepalives_interval等配置项。
Host Alias
client配置直接使用alias连接 可以使用类似别名来定义登录的ip和port,在客户端配置文件中设置,比如:
bash
Host dev
HostName 10.122.48.222
IdentityFile /home/username/.ssh/id_rsa
User username
LogLevel INFO
Compression yes
ServerAliveInterval 30
ServerAliveCountMax 10
配置后就可以直接使用ssh dev
登录,如果想看整个登录的交互过程,可以使用ssh -v dev
,包括登录失败时一些有用信息。
公钥绵密登录
如上所示使用了IdentityFile
的配置,登录分为公钥登录和密码登录,密码登录不说了,公钥登录就是说首先要将客户端的公钥放到Server的authorized_keys
里面,登录的时候就会使用非对称密钥形式校验。Server配置里面可以选择使用登录方式(PasswordAuthentication
和PubkeyAuthentication
)。SSH提供了ssh-copy-id
命令操作以上过程:
typescript
shell ssh-copy-id -i ~/.ssh/id_rsa.pub username@ip
这样就能使用上一步中的命令免密登录了。有时候即使我们设置了上述的配置,操作后还是要使用密码登录,会有很多原因导致,我们需要拿到日志信息分析,客户端可以添加Verbose参数(-v),服务端可以查看SSH的日志信息,我的机器位于/var/log/auth.log(需要提升权限访问),使用sshd关键字查询(/sshd)。我遇到过的问题原因是服务端的用户目录权限变更了,修改完(755)后免密登录成功。
X11 forwarding
有时候我们使用Windows上面默认ssh命令连接host(假设ubuntu桌面版,重要是使用X server)后,想使用剪贴板,比如xclip等工具,会发现报错:
bash
shell echo "hello" | xclip -i -sel clipboard # Error: Can't open display: (null)
原因是因为Windows上没有X server。客户端和服务端均需要配置:
- 首先是客户端windows下载使用vcxsrv 模拟 X server,安装后运行,然后在powershell中运行:
shell
PS> $env:DISPLAY = "localhost:0" # 保证X server可以使用网络socket连接
PS> ssh -X -Y username@ip
- ssh服务端需要允许X11 forwarding,具体修改/etc/ssh/sshd_config文件里面的如下配置再重启sshd服务
bash
Host *
X11Forwarding yes
现在就可以使用剪贴板了,另外vcxsrc还可以和windows上的WSL配合。
Tmux
使用ssh登陆后,如果有运行时间长的编译或者重要任务时,如果中途网络断了或者ssh客户端意外关闭,那前面的任务状态就未知了,有可能出现意想不到的结果。比如在Ubuntu中更新时意外断开了,那有可能再次登入更新时,会报错说lock住了。这个很有可能是意外断开导致更新进程来不及释放前面更新使用的锁。可以使用ssh加上tmux组合解决,因为tmux是服务端额外开的服务,即使ssh断开,tmux server还是在服务端运行,下次再次attach上就行,可以避免出现上述的问题了。修改配置~/.ssh/config,在Host下添加
arduino
Host *
RequestTTY yes
RemoteCommand tmux new-session -A
注意RequestTTY yes
一定要加上。
打洞
shell
# NOTICE: 使用中发现Cmder无法使用常规的Ctrl-C关闭,直接关闭cmder进程,ssh还会驻留一段时间`
ssh -v -C -f -N -g -D 29999 -p 8989 username@ip_addr`
# -v: verbose`
# -C: compress`
# -f: fork it to a background command`
# -N: not execute remote command, just for forwarding ports`
# -g: allows remote hosts to connect to local forwarded ports`
# -D: Specifies a local "dynamic" application-level port forwarding.`
# -p server port, default 22`
上述命令会将在本地监听29999,将29999收到的流量转发到ssh server端,实现流量转发。