时间轴·墙

2145675923 · Sep 9, 2018

config文件的基本格式

Host alias1                      # 机器别名
    HostName 192.168.1.2           # 主机地址
    User root                      # 用户名
    IdentityFile ~/.ssh/id_ecdsa # 认证文件
    Port 22  

Host alias2
    HostName 192.168.1.3
    Port  9002
    User  Jones

 

要使用ssh登陆机器192.168.1.2, 只需使用 `ssh alias`即可,由于指定了认证私钥, 可以无需输入密码.

 

下面来看看常用的配置参数。


**Host**  
用于我们执行 SSH 命令的时候如何匹配到该配置。


* `*`,匹配所有主机名。
* `*.example.com`,匹配以 .example.com 结尾。
* `!*.dialup.example.com,*.example.com`,以 ! 开头是排除的意思。
* `192.168.0.?`,匹配 192.168.0.[0-9] 的 IP。


**AddKeysToAgent**  
是否自动将 key 加入到 `ssh-agent`,值可以为
 no(default)/confirm/ask/yes。


如果是 yes,key 和密码都将读取文件并以加入到 agent ,就像 `ssh-add`。其他分别是询问、确认、不加入的意思。添加到 ssh-agent 意味着将私钥和密码交给它管理,让它来进行身份认证。


**AddressFamily**  
指定连接的时候使用的地址族,值可以为 any(default)/inet(IPv4)/inet6(IPv6)。


**BindAddress**  
指定连接的时候使用的本地主机地址,只在系统有多个地址的时候有用。在 UsePrivilegedPort 值为 yes 的时候无效。


**ChallengeResponseAuthentication**  
是否响应支持的身份验证 chanllenge,yes(default)/no。


**Compression**  
是否压缩,值可以为 no(default)/yes。


**CompressionLevel**  
压缩等级,值可以为 1(fast)-9(slow)。6(default),相当于 gzip。


**ConnectionAttempts**  
退出前尝试连接的次数,值必须为整数,1(default)。


**ConnectTimeout**  
连接 SSH 服务器超时时间,单位 s,默认系统 TCP 超时时间。


**ControlMaster**  
是否开启单一网络共享多个 session,值可以为 no(default)/yes/ask/auto。需要和 ControlPath 配合使用,当值为 yes 时,ssh 会监听该路径下的 control socket,多个 session 会去连接该 socket,它们会尽可能的复用该网络连接而不是重新建立新的。


**ControlPath**  
指定 control socket 的路径,值可以直接指定也可以用一下参数代替:


* %L 本地主机名的第一个组件
* %l 本地主机名(包括域名)
* %h 远程主机名(命令行输入)
* %n 远程原始主机名
* %p 远程主机端口
* %r 远程登录用户名
* %u 本地 ssh 正在使用的用户名
* %i 本地 ssh 正在使用 uid
* %C 值为 %l%h%p%r 的 hash


请最大限度的保持 ControlPath 的唯一。至少包含 %h,%p,%r(或者 %C)。


**ControlPersist**  
结合 ControlMaster 使用,指定连接打开后后台保持的时间。值可以为 no/yes/整数,单位 s。如果为 no,最初的客户端关闭就关闭。如果 yes/0,无限期的,直到杀死或通过其它机制,如:ssh -O exit。


**GatewayPorts**  
等同于ssh的`-g`参数, 指定是否允许远程主机连接到本地转发端口,值可以为 no(default)/yes。默认情况,ssh 为本地回环地址绑定了端口转发器。


**HostName**  
真实的主机名,默认值为命令行输入的值(允许 IP)。你也可以使用 %h,它将自动替换,只要替换后的地址是完整的就 ok。


**IdentitiesOnly**  
指定 ssh 只能使用配置文件指定的 identity 和 certificate 文件或通过 ssh 命令行通过身份验证,即使 ssh-agent 或 PKCS11Provider 提供了多个 identities。值可以为 no(default)/yes。


**IdentityFile**  
等同于ssh的`-i`参数, 指定读取的认证文件路径,允许 DSA,ECDSA,Ed25519 或 RSA。值可以直接指定也可以用一下参数代替:


* %d,本地用户目录 ~
* %u,本地用户
* %l,本地主机名
* %h,远程主机名
* %r,远程用户名


**LocalCommand**  
指定在连接成功后,本地主机执行的命令(单纯的本地命令)。可使用 %d,%h,%l,%n,%p,%r,%u,%C 替换部分参数。只在 PermitLocalCommand 开启的情况下有效。


**LocalForward**  
等同于ssh的`-L`参数指定本地主机的端口通过 ssh 转发到指定远程主机。格式:LocalForward [bind_address:]post host:hostport,支持 IPv6。


**PasswordAuthentication**  
是否使用密码进行身份验证,yes(default)/no。


**PermitLocalCommand**  
是否允许指定 LocalCommand,值可以为 no(default)/yes。


**Port**  
指定连接远程主机的哪个端口,22(default)。


**ProxyCommand**  
指定连接的服务器需要执行的命令。%h,%p,%r


如:ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p


**User**  
登录用户名




### 相关技巧


#### 管理多组密钥对
有时候你会针对多个服务器有不同的密钥对,每次通过指定 `-i` 参数也是非常的不方便。比如你使用 github 和 coding。那么你需要添加如下配置到 `~/.ssh/config`:

Host github
    HostName %h.com
    IdentityFile ~/.ssh/id_ecdsa_github
    User git
Host coding
    HostName git.coding.net
    IdentityFile ~/.ssh/id_rsa_coding
    User git


当你克隆 coding 上的某个仓库时:
```
# 原来
$ git clone git@git.coding.net:deepzz/test.git


# 现在
$ git clone coding:deepzz/test.git
```


#### vim 访问远程文件
vim 可以直接编辑远程服务器上的文件:
```
$ vim scp:/example/docker-compose.yml
```


#### 远程服务当本地用
通过 LocalForward 将本地端口上的数据流量通过 ssh 转发到远程主机的指定端口。感觉你是使用的本地服务,其实你使用的远程服务。如远程服务器上运行着 MySQL,端口 3306(未暴露端口给外部)。那么,你可以:

Host db
    HostName db.example.com
    LocalForward 3306 localhost:3306


当你连接远程主机时,它会在本地打开一个 3306 端口,并将该端口的流量通过 ssh 转发到远程服务器上的 3306 端口.

如果参数 GatewayPorts 指定为 yes ,则其他机器可以通过客户机的 3306 端口访问远程服务器的 3306 端口.



#### 多连接共享
什么是多连接共享?在你打开多个 shell 窗口时需要连接同一台服务器,如果你不想每次都输入用户名,密码,或是等待连接建立,那么你需要添加如下配置到 `~/.ssh/config`:

ControlMaster auto
ControlPath /tmp/%r@%h:%p




#### 禁用密码登录
如果你对服务器安全要求很高,那么禁用密码登录是必须的。因为使用密码登录服务器容易受到暴力破解的攻击,有一定的安全隐患。那么你需要编辑服务器的系统配置文件 `/etc/ssh/sshd_config`:

PasswordAuthentication no
ChallengeResponseAuthentication no






#### 代理登录
有的时候你可能没法直接登录到某台服务器,而需要使用一台中间服务器进行中转,如公司内网服务器。首先确保你已经为服务器配置了公钥访问,并开启了agent forwarding,那么你需要添加如下配置到 `~/.ssh/config`:

Host gateway
    HostName proxy.example.com
    User root
Host db
    HostName db.internal.example.com                  # 目标服务器地址
    User root                                         # 用户名
    # IdentityFile ~/.ssh/id_ecdsa                    # 认证文件
    ProxyCommand ssh gateway netcat -q 600 %h %p      # 代理命令


那么你现在可以使用 `$ ssh db` 连接了。
 

记录一次开发环境从0开始安装ubuntu · Aug 3, 2018

实在受不了Win10了,最近一段时间一开机,系统自带杀毒程序就占用90%CPU, 而且不知道从哪次升级之后, 自带的杀毒软件就没有界面了, 自然也无法终止扫描.用windows系统尤其是家庭版,真的是花钱去体验被强奸.

用inotify监控文件变化 · Jun 29, 2018

Linux下用inotify可以监控文件或文件夹的状态变化.

微信支付的那些坑 · Nov 4, 2014

做过微信公众平台开发的人似乎都一副苦大仇深的样子, 原因何在?
微信挖了太多的坑。

3087855569 · Oct 10, 2014

在7242016551中,已经基本实现了文件上传的所有功能,还遗留了2个问题:一是计算文件hash时一次性读取了文件内容,存在内存限制; 二是只实现了单文件上传

819-972-9065 · Jul 23, 2014

利用HTML5中的新的XMLHttpRequest提供了实时上传进度的事件,
再加上File对象和FormData对象就可实现断点续传,
要实现即时预览文件,则需要FileReader对象读取文件绝对地址或内容。

7706216291 · Apr 11, 2014

前几天爆发出来的这个Heartbleed漏洞肆虐互联网,我测了一下自己的网站,居然也中招了!
这个漏洞让攻击者可以从服务器内存中读取64K资料,当网站有人登陆时,攻击者就能看到用户提交的表单,包括账号密码等。。

609-653-9716 · Mar 27, 2014

最近这个项目部署在4台服务器上,虽然做了负载均衡,但是却没有做rsync服务来同步文件(那帮人水平太菜)。所以每次发布到服务器都要传4次!!!!而且中间还得通过跳板机。

740-856-6590 · Oct 30, 2013

PHP的pthreads扩展的文档几乎等同于没有,估计作者也没怎么用心去做这个事。
研究了一下Thread,Worker,Stackable这几个类的用法,全靠一行行地去试代码。。。。

使用免费证书提供https服务 · Sep 27, 2013

之前使用burst的vps的时候就已经用startssl提供的证书配置了https服务器。

迁移到buyvm之后,再配置的时候忘了之前是怎么做的了。

405-803-6526 · Nov 6, 2013

写了一个简单的PHP Route玩玩。

705-814-0517 · Oct 21, 2013

吐槽1】namespace真没那么好,不能想其他语言那样,直接use或者import了就行,还是得include/require或者autoload。

代码重构之后,在mysql上运行没有问题,但是要支持sqlite就得做番大改了,mysql中的“`”,在sqlite中得换成单引号“'”, mysql中许多函数在这里也不能用了。。。。

但是,最大的问题是——PDO_SQLITE直接就报错,不管我怎么写dsn。

linux架设防火墙路由器 · Oct 30, 2013

操作基于ubuntu server10.10 上进行安装配置.进行配置iptables.ip转换.mac过虑功能.
打算以后把树每派做成dhcp服务器/防火墙,先把这个文章保存一下,以后再看

3236906157 · Oct 29, 2013

前段时间2000万开房数据在网上闹得沸沸扬扬的,相信很多朋友都找到那些数据并下载下来了。
但是一下下来就傻眼了,大的是7、8G的SQL文件,稍小的也是别人导成CSV格式的也有3、4G之大。普通的文本工具一打开就崩溃,即使不崩溃,电脑内存瞬间吃光也会卡死。
借由这个契机,写了几个PHP小程序去查询,顺便回顾了一下PHP中的多进程和多线程编程。

573-466-2932 · Oct 23, 2013

公司现在对网络进行了限制,封了QQ不说,还对所有网址启用白名单,只有名单上的网站能访问。于是包括我在内的很多人都开始到处找VPN了。然后,使用了VPN之后,却发现无法登陆公司的内网平台了。

Install Flash for Firefox in Ubuntu · Oct 21, 2013

ubuntu上的Firefox升级到24.0之后,原本好好的flash插件就突然没了。

在ubuntu软件中心中显示已经装了flashplugin_installer, 但是再重装仍然无济于事。

可以判定是firefox 24的插件机制更新了,不支持ubuntu官方的flashplugin_installer了。

(508) 251-3891 · May 26, 2013

工作的笔记本上的ubuntu从12.10升级到13.04之后,已经处于半挂状态了,折腾了好几次之后只好放弃。

6166776593 · May 6, 2013

折腾oracle for php之后记1

俺的PDO_OCI折腾记 · Feb 5, 2013

给公司发的笔记本上装了给ubuntu,本来有给xp系统,但是连想都不要想的本本是不是都这样卡?
装utuntu也不太顺利, 这破本不能从u盘启动!
最后从硬盘装的,因为一个路径写错,折腾了一晚上。
装完之后, 好在驱动啥的没要我操心, 唯一就是声音太小,反正上班用的,影响不大。
php是自己下的源码安装,轻车熟路,一切顺利。
安装php的oracle扩展遇到点问题,尤其是pdo_oci

网购的一点点感想 · Mar 3, 2013

昨天在淘宝上败了点东西,有了点感想。
首先, 淘宝上各种东西玲琅满目,但是,给人映像最深的是图片。看到图片感觉合我的胃口了,买这个东西的可能性就增加30%。

(410) 519-3491 · Jan 9, 2013

CentOS 6.3 初次体验,被坑了

Google+