鲜为人知却很有用的SSH技巧


鲜为人知却很有用的SSH技巧

文章插图
 
现在远程服务器管理最常用的方式要数SSH(Secure Shell了) 。SSH以其最简便的方式连接连接,并对通讯过程进行加密 。基于所使用的算法,一般认为窃听通过ssh通讯基本上不可能 。SSH使用的客户端,在linux或Unix上一般是直接用ssh命令,在windows 上在Cygwin或WSL等类Linux环境下也支持 。Windows系统会用很多客户端软件,比如SecureCRT Xshell,我使用的是免费开源的Putty 。
使用ssh有很多技巧,有些非常简单,有些则超出了一个终端应用的范畴 。我们知道ssh可以安全地传输文件(scp),也可以通过ssh挂载远程文件系统;可以使用ssh浏览器中安全遨游网络,还可以使用ssh隧道加密传输流量 。本文虫虫给大家介绍一下SSH的一些技巧 。我们假设读者了解一些SSH基础知识:用scp和sftp用于文件复制,ssh-copy-id用于设置无密码证书登录,当然你不知道也没关系,问下度娘10分钟内就可以搞定 。
SSH别名ssh命令行上有很多选项要记住,比如IP、端口、用户名、私钥(如果不是标准位置和名字的证书,或者多个证书时候),但是实际上是可以偷懒的,甚至IP,端口我们都不需要记,只需要在~/.ssh /config文件中,可以创建一个别名,设置后这些选项即可 。例如,假设要连接到一台主机,我们给他设置别名为Chongchong:
Host chongchong
HostName ijz.me
Port 1234
User cc
IdentityFile ~/.ssh/chongchong_id
ForwardX11 yes
Compression yes
【鲜为人知却很有用的SSH技巧】TCPKeepAlive yes
可以根据需要使用任意多个别名 。至于添加多个"Host"配置行即可 。可以在一个Host语句中添加多个别名 。随后的选项可以用于任何一个别名 。
配置后我们只需连接ssh congchong,就会启用所有配置的选项 。
当然,如果使用的是Putty客户端,主要选项都在其配置的Session面板和SSH面板中 。可能没有太多选择,但是可以尝试一些 。
鲜为人知却很有用的SSH技巧

文章插图
 
几个有用的配置项ControlMaster有一组非常有用的SSH配置项,包括设置master控制文件 。例如:
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
这可以使连接同一主机的多个会话共享一个TCP套接字 。因为设置安全套接字需要花费一些时间,如果在两个主机之间进行多个会话,该设置加快速度 。可以使用配置文件中的Host *项对所有主机设置 。还可以将其用于全局选项 。
需要注意的是,如果通过多个连接传输大量数据,则ControlMaster配置可能会影响传输,这时候可以使用-S none来临时覆盖掉全局设置关闭它 。
另外,如果在关闭所有其他连接之前尝试退出,则第一个ssh会话看起来可能会挂起 。可以对登录到经常连接的主机时运行一个隐藏的ssh会话,可以避免该问题 。但是,更好的方法是设置ControlPersist yes 。这会使原始会话无限期地进入后台 。可以对它设置时间限制,比如设置ControlPersist为180(或其他数字) 。表示三分钟内没有连接,会自动关闭连接 。
这种方法的另一个缺点是,会产生很多的master垃圾文件 。可以设置登陆时候自动清理,比如rc.local设置:
/bin/rm /home/*/.ssh/master-* || true >/dev/null
如果使用Putty客户端,可以在SSH选项面板中选中"Share SSH connections if possible"多选项来设置 。
鲜为人知却很有用的SSH技巧

文章插图
 
BatchMode配置文件中还使用很多配置选项 。例如,BatchMode告诉ssh该连接是无人值守应用,避免不必要的提示用户输入密码或其他交互性的内容 。如果认证项设置不全就会直接报错退出 。
SendEnv可以在SSH连接时发送环境变量发送给远程主机 。例如,希望在工作站和服务器上始终保持LS_COLORS相同,但是会经常更改,并且不希望使用相同的配置文件 。可以添加下面配置:
SendEnv LS_COLORS
Putty可以从其configure页的"Connect/Data"选项卡中设置环境变量 。
TCPKeepAlive在网络端,如果希望服务器和客户端在空闲时不会断开,则可以设置TCPKeepAlive指定为yes 。如果连接处于空闲状态,则不会断开连接 。。
远程命令执行这是SSH最有用的技巧 。我们时常要登陆主机仅仅是为了执行一些命令,如果为了个别命令或者批量操作需要(当然可以用ansible等),要登陆主机在操作就有点不方便了 。实际上,如果只是为了执行命令或者脚本,完全可以不用登陆到远程主机,直接用ssh命令就可以 。


推荐阅读