ssh配置

[TOC]

ssh只使用密码登陆

若直接执行下面的命令,

ssh <用户名>@<服务器地址>
# 或
ssh <服务器别名>

出现报错

Received disconnect from <服务器地址> port <端口号>:2: Too many authentication failures

则说明你的添加到钥匙串的ssh密钥太多了(ssh-add -L可以查看所有钥匙串里的密钥),需要手动指定必须只用密码登陆,方法如下:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no <用户名>@<服务器地址>
# 或
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no <服务器别名>

上述参数同样适用于 ssh-copy-id

ssh别名、免密登录

别名登陆

参考1, 参考2

本地电脑上,打开~/.ssh/config文件

vim ~/.ssh/config

编写格式如下

Host 服务器别名1
    HostName 服务器ip或网址1
    Port 端口号1
    User 用户名1
    IdentityFile ~/.ssh/id_rsa

Host 服务器别名2
    HostName 服务器ip或网址2
    Port 端口号2
    User 用户名2
    IdentityFile ~/.ssh/id_rsa

...

~/.ssh/id_rsa即为本地私钥

例如

Host myserver
    HostName some.place.com
    Port 4123
    User pitter
    IdentityFile ~/.ssh/id_rsa

免密登录

参考

本地电脑上

生成密钥

  • 交互模式
ssh-keygen

然后不断回车确认,~/.ssh下会生成两个文件:id_rsa(私钥)和id_rsa.pub(公钥)

若显示已有密钥,问你要不要覆盖,则选不要

  • 非交互模式
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa -q # -b 2048 -C "注释"

~/.ssh/id_rsa不存在时,运行这个不会产生输出。

~/.ssh/id_rsa存在时,运行这不会产生输出

/home/用户名/.ssh/id_rsa already exists.
Overwrite (y/n)?

参数说明:

  • -P "" 密码为空

  • -f id_rsa 是指保存文件为~/.ssh/id_rsa~/.ssh/id_rsa.pub

  • -q 静默模式,即不产生如下输出,除非报错

    Generating public/private rsa key pair.
    Your identification has been saved in /home/用户名/.ssh/id_rsa.
    Your public key has been saved in /home/用户名/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:DasvExxxxxxK//JIqsxxxxxxxxxn4AdbabU 用户名@服务器
    The key's randomart image is:
    +---[RSA 2048]----+
    | .. xxxxx    xx  |
    |... xxxxx xx     |
    |= xxxxx    xx    |
    |ooxx .xxxxxxxxx  |
    |.  xxxxx    xx . |
    |. xxxxx    x  E  |
    |..o xxxxx    +   |
    |  xxxxx    xx    |
    |+ sssddx   .     |
    +----[SHA256]-----+
  • -b 位数 默认是 2048,可以指定 1024 等

  • -C 注释 默认为"$USER@$(hostname)"提供一个新注释,

发送公钥到目标机器

凡可免密访此服务器之私钥,其对应公钥皆保存在~/.ssh/authorized_keys中。

以下命令可将本地公钥追加到服务器的~/.ssh/authorized_keys结尾:

ssh-copy-id -o PreferredAuthentications=password -o PubkeyAuthentication=no [-i <公钥或对应私钥路径>]  [-p 端口号] 用户名@服务器

或使用别名发送

ssh-copy-id -o PreferredAuthentications=password -o PubkeyAuthentication=no [-i <公钥或对应私钥路径>] 服务器别名

<公钥或对应私钥路径>指定,则将本地公钥公钥路径 全文复制,粘贴进服务器的~/.ssh/authorized_keys文件中。

<公钥或对应私钥路径>缺省:

  • 若钥匙串为空(即ssh-add -L返回为空白),则将~/.ssh/id_rsa.pub全文黏贴到服务器的~/.ssh/authorized_keys文件中。
  • 若钥匙串不空(即ssh-add -L返回有至少一条公钥)则将本地钥匙串中所有公钥的全文(即ssh-add -L所返回的),都黏贴到服务器的~/.ssh/authorized_keys文件中。

因此,尽可能手动指定-i <公钥或对应私钥路径>

免密登录

本地电脑

ssh [-p <端口号>] <用户名>@<服务器>

ssh <服务器别名>

皆可不用输入密码,直接登录

bug

Bad owner or permissions

在执行ssh登录的时候,出现以下错误:

Bad owner or permissions on /home/haowt/.ssh/config

此时只需在~/.ssh/下执行

sudo chmod 600 config

config文件以“600”权限,则可ssh登录

能读取~/.ssh/config的软件

  • 能读取~/.ssh/config的软件

    sshsshfsscpsftprsync,在iTerm2上对着远程的文件右键下载文件

  • 不能读取~/.ssh/config的软件

    待补充

端口转发

LocalForward RemoteForward
功能 把本地请求转发到远程 为把远程请求转发到本地
服务进程(多为守护进程) 在远程 在本地
访问进程(如浏览器) 在本地 在远程
例如 本地访问远程的jupiter notebook 远程用nc发送消息到本地的监听进程
ssh config的写法xxxForward 请求端口 ip:接受端口 LocalForward 本地端口 localhost:远程端口 RemoteForward 服务器端口 localhost:本机端口
ssh命令的参数 -L 本地端口:localhost:远程端口 -R 服务器端口:localhost:本机端口

跳板连接

参考

<跳板>机器为跳板,连接<目标>机器,需在~/.ssh/config配置

Host <目标>
    HostName <从跳板机访问目标机器用的ip>
    User <目标机用户名>
    # 登陆目标机永用的私钥所在位置
    IdentityFile ~/.ssh/id_rsa
    # 允许跳板机用本机私钥登录目标机器
    ForwardAgent yes

    # 法一: OpenSSH 版本>= 7.3; 或 autossh
    ProxyJump <跳板>

    # 法二: OpenSSH 版本< 7.3, 不支持以使用ProxyJump, 可使用ProxyCommand; 但autossh不支持用ProxyCommand
    # ProxyCommand ssh -q -W %h:%p <跳板>

Host <跳板>
  HostName <从本地访问跳板机用的ip>
    User <跳板机用户名>
    # 登陆跳板机的私钥所在位置
    IdentityFile ~/.ssh/id_rsa

这样设置后,以下软件的用法和直接连接目标机器一样

ssh(包括端口转发功能),sshfsscpsftprsync,在iTerm2上对着远程的文件右键下载文件

ssh 重启

linux

重启ssh启服务端

每当修改完ssh服务端的设置文件 /etc/ssh/sshd_config 需要重启ssh服务端服务(即sshd

sudo service sshd restart

sudo systemctl restart sshd.service

注:systemctl 兼容了 service详见

mac

启动ssh服务端

的较新 Mac 设备都会默认预装 SSH,不过 SSH 守护进程是默认禁用的。今天我们就来一起学习如何通过终端指令来开启和关闭 SSH。

  • 是否开启ssh服务端
sudo systemsetup -getremotelogin
# 如果已经开启的话,指令会显示 “Remote Login: On” ,反之就会显示“Remote Login: Off”。
  • 开启
sudo systemsetup -setremotelogin on
  • 关闭
sudo systemsetup -setremotelogin off

开机自启ssh服务端

mac本身安装了ssh服务,默认情况下不会开机自启

  • 开机自启sshd服务:
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
  • 开机不自启sshd服务:
sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist
  • 查看是否开机自启:
sudo launchctl list | grep ssh
# 如果看到下面的输出表示成功启动了
# - 0 com.openssh.sshd