# SSH 免密登录服务器



## 1. 在本地机器创建公钥

打开万能的终端，执行如下命令，无视一切输出，一路欢快地回车即可。

```shell
ssh-keygen -t rsa -C 'your email@domain.com'
```

-t 指定密钥类型，默认即 rsa ，可以省略

-C 设置注释文字，比如你的邮箱

## 2. 将公钥复制到ssh服务器

将前一步骤生成的公钥 `~/id_rsa.pub` 文件，复制到ssh服务器对应用户下的 `~/.ssh/authorized_keys` 文件,可以有多种方式，这里只介绍常用的三种。

- [适用于osx系统] 使用 [ssh-copy-id-for-OSX](https://github.com/beautifulcode/ssh-copy-id-for-OSX) 工具将公钥复制至ssh服务器

```shell
brew install ssh-copy-id
ssh-copy-id username@hostname  #将username和hostname替换为你的ssh服务器用户名和IP
```

- 当ssh服务器 `username` 用户目录下尚未有 `.ssh` 目录时使用此方式

```shell
cat ~/.ssh/id_rsa.pub | ssh username@hostname "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"
```

- 通用方式

```shell
scp ~/.ssh/id_rsa.pub username@hostname:~/ #将公钥文件复制至ssh服务器
ssh username@hostname #使用用户名和密码方式登录至ssh服务器
mkdir .ssh  #若.ssh目录已存在，可省略此步
cat id_rsa.pub >> .ssh/authorized_keys  #将公钥文件id_rsa.pub文件内容追加到authorized_keys文件
```

## 3. 快捷登录

完成以上步骤后，即可使用以下命令直接登录ssh服务器，妈妈再也不用担心你记不住密码了

```shell
ssh username@hostname #将username替换为你的ssh服务器用户名，hostname替换为服务器的ip
```

但是，每次仍然需要输入 `ssh username@hostname` ，仍算不上最优的解决方案，要是能实现一键登录或一条命令登录最好不过了，下面来看看都有那些解决方法

- ssh本身也提供了一种快捷的方式来解决这个问题，往 `~/.ssh/config` 配置文件添加你的 ssh 服务器信息即可

```shell
vim ~/.ssh/config   #若没有该文件，直接新建即可
```

添加文件内容格式如下：

```shell
Host        alias #自定义别名
    HostName        hostname  #替换为你的ssh服务器ip或domain
    Port            port #ssh服务器端口，默认为22
    User            user #ssh服务器用户名
    IdentityFile    ~/.ssh/id_rsa #第一个步骤生成的公钥文件对应的私钥文件
```

保存文件退出后，即可使用别名登录ssh服务器

```shell
ssh alias #alias是你在~/.ssh/config文件配置的别名
```

若有多个ssh账号需要配置，只要在~/.ssh/config空行再写即可，如下:

``` shell
Host        foo
    HostName        192.168.2.222
    Port            22
    User            test
    IdentityFile    ~/.ssh/id_rsa

Host        alias
    HostName    hostname
    Port        port
    User        user
```

- 如果你本地终端使用的是**zsh**，那就太简单不过了，直接给zsh添加一条别名

```shell
echo "alias ssh-to-username='ssh username@hostname'" >> ~/.zshrc #将username和hostname替换为你的服务器信息
source ~/.zshrc   #重新加载更改后的zshrc文件
ssh-to-username   #使用别名，一条命令即可登录你的ssh服务器
```

- 如果你本地终端使用的是**iterm2**还可以添加**Profile**实现一键登录，具体步骤此处略过
  [参考链接](http://hiltmon.com/blog/2013/07/18/fast-ssh-windows-with-iterm-2/)

