SSH Config 那些你所知道和不知道的事 (转)
原文地址:https://deepzz.com/post/how-to-setup-ssh-config.html
SSH(Secure Shell)是什么?是一项创建在应用层和传输层基础上的安全协议,为计算机上的 Shell(壳层)提供安全的传输和使用环境。也是专为远程登录会话和其他网络服务提供安全性的协议。它能够有效防止远程管理过程中的信息泄露问题。通过 SSH 可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗。
具体生成 SSH Key 方式请参考:Github ssh key生成,免密登录服务器方法。这里以 id_ecdsa
(私钥) 和 id_ecdsa.pub
(公钥) 为例。
本篇文章主要介绍 SSH 相关的使用技巧。通过对
~/.ssh/config
文件的配置你可以大大简化 SSH 相关的操作,如:
Host example # 关键词
HostName example.com # 主机地址
User root # 用户名
# IdentityFile ~/.ssh/id_ecdsa # 认证文件
# Port # 指定端口
通过执行 $ ssh example
我就可以登录我的服务器。而不需要敲更多的命令 $ ssh root@example.com
。又如我们想要向服务器传文件 $ scp a.txt example:/home/user_name
。比以前方便多了。
更过相关帮助文档请参考 $ man ssh_config 5
。
配置项说明
SSH 的配置文件有两个:
$ ~/.ssh/config # 用户配置文件
$ /etc/ssh/ssh_config # 系统配置文件
下面来看看常用的配置参数。
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
指定是否允许远程主机连接到本地转发端口,值可以为 no(default)/yes。默认情况,ssh 为本地回环地址绑定了端口转发器。
HostName
真实的主机名,默认值为命令行输入的值(允许 IP)。你也可以使用 %h,它将自动替换,只要替换后的地址是完整的就 ok。
IdentitiesOnly
指定 ssh 只能使用配置文件指定的 identity 和 certificate 文件或通过 ssh 命令行通过身份验证,即使 ssh-agent 或 PKCS11Provider 提供了多个 identities。值可以为 no(default)/yes。
IdentityFile
指定读取的认证文件路径,允许 DSA,ECDSA,Ed25519 或 RSA。值可以直接指定也可以用一下参数代替:
- %d,本地用户目录 ~
- %u,本地用户
- %l,本地主机名
- %h,远程主机名
- %r,远程用户名
LocalCommand
指定在连接成功后,本地主机执行的命令(单纯的本地命令)。可使用 %d,%h,%l,%n,%p,%r,%u,%C 替换部分参数。只在 PermitLocalCommand 开启的情况下有效。
LocalForward
指定本地主机的端口通过 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://root@example.com//home/centos/docker-compose.yml
$ vim scp://example//home/centos/docker-compose.yml
远程服务当本地用
通过 LocalForward 将本地端口上的数据流量通过 ssh 转发到远程主机的指定端口。感觉你是使用的本地服务,其实你使用的远程服务。如远程服务器上运行着 Postgres,端口 5432(未暴露端口给外部)。那么,你可以:
Host db
HostName db.example.com
LocalForward localhost:
当你连接远程主机时,它会在本地打开一个 5433 端口,并将该端口的流量通过 ssh 转发到远程服务器上的 5432 端口。
首先,建立连接:
ssh db
之后,就可以通过 Postgres 客户端连接本地 5433 端口:
psql -h localhost -p orders
多连接共享
什么是多连接共享?在你打开多个 shell 窗口时需要连接同一台服务器,如果你不想每次都输入用户名,密码,或是等待连接建立,那么你需要添加如下配置到 ~/.ssh/config
:
ControlMaster auto
ControlPath /tmp/%r@%h:%p
禁用密码登录
如果你对服务器安全要求很高,那么禁用密码登录是必须的。因为使用密码登录服务器容易受到暴力破解的攻击,有一定的安全隐患。那么你需要编辑服务器的系统配置文件 /etc/ssh/sshd_config
:
PasswordAuthentication no
ChallengeResponseAuthentication no
关键词登录
为了更方便的登录服务器,我们也可以省略用户名和主机名,采用关键词登录。那么你需要添加如下配置到 ~/.ssh/config
:
Host deepzz # 别名
HostName deepzz.com # 主机地址
User root # 用户名
# IdentityFile ~/.ssh/id_ecdsa # 认证文件
# Port # 指定端口
那么使用 $ ssh deepzz
就可以直接登录服务器了。
代理登录
有的时候你可能没法直接登录到某台服务器,而需要使用一台中间服务器进行中转,如公司内网服务器。首先确保你已经为服务器配置了公钥访问,并开启了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 %h %p # 代理命令
那么你现在可以使用 $ ssh db
连接了。
SSH Config 那些你所知道和不知道的事 (转)的更多相关文章
- overflow:hidden 你所不知道的事
overflow:hidden 你所不知道的事 overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. ...
- ES6 你可能不知道的事 – 基础篇
序 ES6,或许应该叫 ES2015(2015 年 6 月正式发布),对于大多数前端同学都不陌生. 首先这篇文章不是工具书,不会去过多谈概念,而是想聊聊关于每个特性 你可能不知道的事,希望能为各位同学 ...
- Java你可能不知道的事(3)HashMap
概述 HashMap对于做Java的小伙伴来说太熟悉了.估计你们每天都在使用它.它为什么叫做HashMap?它的内部是怎么实现的呢?为什么我们使用的时候很多情况都是用String作为它的key呢?带着 ...
- java你可能不知道的事(2)--堆和栈
在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...
- Spring中你可能不知道的事(一)
Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...
- java你可能不知道的事(2)--堆和栈<转>
在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...
- 关于JavaScript对象,你所不知道的事(二)- 再说属性
说完了对象那些不常用的冷知识,是时候来看看JavaScript中对象属性有哪些有意思的东西了. 不出你所料,对象属性自然也有其相应的特征属性,但是这个话题有点复杂,让我们先从简单的说起,对象属性的分类 ...
- 微信5.4你所不知道的事 X5浏览引擎提速50%-80%
微信5.4新增包括搜索公众号.识别图中二维码.面对面收钱等功能,但是你可知道新版微信X5浏览引擎提速了,提升50%-80%的网络传输速度及相同比例流量节省? 从X5浏览引擎开发人员得知,X5浏览技术基 ...
- 关于JavaScript对象,你所不知道的事(一)- 先谈对象
这篇博文的主要目的是为了填坑,很久之前我发表了一篇名为关于JavaScript对象中的一切(一) - 对象属性的文章,想要谈一谈JavaScript对象,可那时只是贴了一张关于这个主题的思维导图,今天 ...
随机推荐
- kmeans
K均值(K-means)算法 ).setSeed(1L) val model=kmeans.fit(dataset) //Make predictions val predictions=model. ...
- php sleep函数延迟执行
PHP sleep函数一般用于定时执行任务中,表示延迟多少秒在执行程序.这里主机吧主要给大家讲一下sleep函数的语法和应用实例. sleep函数语法: sleep(seconds); //secon ...
- Vue 编程式导航(通过js跳转页面)以及路由hash模式和history模式
第一种方法: this.$router.push({path:'shopcontent?aid=3'} 第二种方法 this.$router.push({name:'news'}} 通过在ma ...
- SQL server 2008(Linux安装)
今天应公司的要求,需要在阿里云上安装sql server 在本地使用,由于自己原来没有涉及过这样的安装所以走了很多的弯路.现在将我的安装过程与大家分享,希望能够帮到想要学习这个方面的人.以下是我用Ce ...
- python-day18 JS正则,组件BootStrap、EasyUI、JQueryUI1,插件轮播,django
@第一节课程内容 js正则 登录注册验证 @text-判断字符串是否符合规定的正则 @exec-获取匹配的数据 bootstrap(组件) –css –js 学习bootstrap规则 jQueryu ...
- leetcode1034
class Solution: def __init__(self): self.V = list() def bfs(self,grid,color,rows,coloums,r,c,ocolor) ...
- drf框架之跨域问题的解决与缓存问题
什么是跨域问题呢: 1. 跨域问题: CORS 跨域资源共享: 有简单请求 和非简单请求 简单请求: 只要符合如下两条,就是简单请求,否则则是非简单请求 (1) 请求方法是以下三种方法之一: HEAD ...
- idea 设置光标回到上一次位置的快捷键
1. file-->settings,搜索 navigate 这个 蓝色的back和forward分别就是光标后退.前进的快捷键了,全部移除原来冲突的快捷键,然后重新设置成自己的快捷键即可. 然 ...
- Golang源码探索(一) 编译和调试源码(转)
GO可以说是近几年最热门的新兴语言之一了, 一般人看到分布式和大数据就会想到GO,这个系列的文章会通过研究golang的源代码来分析内部的实现原理,和CoreCLR不同的是, golang的源代码已经 ...
- 中兴iptv机顶盒破解教程图文:亲测中兴B760EV3、B860A、B860AV1.1完美安装应用!非ttl破解![转]
一直以为中兴的这几个盒子只能通过ttl来破解,不过现在再也不用这么麻烦了,有了这个工具,前后破解不超3分钟!理论上支持所有中兴的iptv机顶盒的破解! 亲测中兴B760EV3.B860A.B860AV ...