引子

近日海淘了一个 mini-PC:Gigabyte GB-BSRE-1605,此设备虽采用 amd 嵌入式低功耗处理器,性能相比现在自己所用的设备却有不小提升,加上先前升级电脑多余一些 ssd 和 ram,于是组了一个个人服务器,装上最新的 ubuntu 20.04 server 后,打算以后作为远程开发的基础主机。现记录一些开发环境配置过程,供参考。

设备无需连接显示器及键盘鼠标等输入设备,第一步,开启远程 ssh 登录。

原理

从客户端来看,ssh 提供两种级别的安全验证:

  1. 基于口令的验证:只要知道帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但缺点是:不能保证你正在连接的服务器就是你想连接的服务器。以下是登录验证流程:



    当第一次链接远程主机时,会提示你当前主机的”公钥指纹”,询问你是否继续,如果选择继续后就可以输入密码进行登录了,当远程的主机接受以后,该台服务器的公钥就会保存到~/.ssh/known_hosts文件中。
  2. 基于密钥的验证:这种验证的前提是客户端需要生成一对密钥,将公钥放到需访问的远程服务器。这种验证比上一种的好处是,不能仿冒真正的服务器,因为要仿冒必须拿到客户端生成的公钥。缺点就是验证等待过程稍长些。

条件

ssh 免登录实现的原理为 ssh 的公钥与私钥配对,此时无需输入登录密码进行认证。假设要从电脑 a 通过 ssh 免密码登录服务器 b,前提条件为:

  1. 服务器 b 需要运行 ssh 服务端程序,并且最好是作为开机自启动服务

  2. 电脑 a 可以运行 ssh 客户端程序,电脑 a 生成了 ssh 的公钥和私钥

  3. 服务器 b 欲登录用户存储了电脑 a 的公钥

步骤

下面分别说明如何实现上面的条件,以及一些注意事项。

  1. 如果服务器为 linux 或者 mac,一般都会自带 ssh 服务端,以 ubuntu 20.04 server 系统为例:





    并且默认开机启动

  2. 电脑如果为 linux 或者 Mac,一般也会自带 ssh 客户端,如果是 windows,可能要单独安装。ssh 公钥和私钥需要通过 ssh-keygen 工具生成,生成 ssh 公私钥的命令一般为 ssh-keygen -t rsa,也可以从其他地方拷贝后放到对应的目录,一般为 ~/.ssh 目录下。
  3. 通过 ssh-copy-id 工具将电脑 a 生成的 ssh 公钥传输到服务器 b,命令格式一般为 ssh-copy-id -i ~/.ssh/id_rsa.pub UserName@RemoteServer,其中 UserName 为服务器 b 的用户名,RemoteServer 为服务器 b 的 ip 或者域名。操作成功后,会将电脑 a 的 ssh 公钥追加到服务器 b 的用户 UserName 用户目录的 .ssh/authorized_keys 文件中
  4. 完成以上操作后,就可以在电脑 a 上通过 ssh 命令免密码登录服务器 b 了,命令格式一般为 ssh UserName@RemoteServer,也可以直接简写为 ssh RemoteServer

其他说明

ssh 免密登陆除了极少数情况下需要自己安装 sshd 服务端程序并配置 ssh_config 以外,经常遇到的问题其实是权限问题。

权限问题:

  1. 传输 ssh 公钥如果遇到一些权限报错,需要将个人主目录下 .ssh 目录及其目录下的文件设置为相应的权限:远程机器的 .ssh 目录需要 700 权限,authorized_keys 文件需要 600 权限

  2. 要正常进行 ssh 免密码登录,客户端机器下 .ssh 目录及其目录下的文件权限为:.ssh 目录需要 700 权限,id_rsa 文件需要 600 权限,其他文件为 644 权限

最后,ssh 免密登录如果需要管理的 ssh 目标主机太多,并且 ip 不是很好记忆,或者有多套 ssh 公私钥,可以通过 ssh config 实现通过别名快速登陆,通过 config 还可以实现流量转发等高级功能,实现远程服务本地调用,后面再详述。

参考资料:

  1. https://superuser.com/questions/215504/permissions-on-private-key-in-ssh-folder
  2. https://gist.github.com/grenade/6318301
  3. https://www.shellhacks.com/ssh-login-without-password/
  4. https://www.linux.com/training-tutorials/ssh-scp-without-password-remote-host-look-ma-no-password/
  5. https://www.jianshu.com/p/0f9b72d691c2
  6. https://deepzz.com/post/how-to-setup-ssh-config.html

ssh 免登录配置的更多相关文章

  1. Linux SSH免登录配置总结(转)

    转载请出自出处:http://eksliang.iteye.com/blog/2187265 一.原理 我们使用ssh-keygen在ServerA上生成私钥跟公钥,将生成的公钥拷贝到远程机器Serv ...

  2. Linux远程登录ssh免密码配置方法(仅供参考)

    这篇文章主要介绍了linux远程登录ssh免密码配置方法,需要的朋友可以参考下(http://www.0834-3659999.com) 一.情景 公司刚上几台Linux,现在要把主机之间都能远程ss ...

  3. Linux实验:ssh免密码配置

    [实验目的]    1)了解ssh工具的作用    2)熟悉ssh配置过程    3)理解ssh原理[实验原理]    SSH是目前比较可靠的专为远程登录会话和其他网络服务提供安全的协议.不同主机之间 ...

  4. Firefly安装ROS及ssh远程登录配置

    一.在Linux firefly 3.10.0 上安装ROS-indigo 快捷键 CTRL + ALT  + T 打开终端并安装ROS-indigo sudo sh -c 'echo "d ...

  5. 【mac】ssh免登录密码

    mac ssh免登录密码 在mac或者Linux上需要使用ssh登服务器,每次都需要输密码感觉很麻烦,搜了一下找到一个脚本,实践后发现可行. 1.创建脚本xx.sh $ vim xx.sh 输入: # ...

  6. LINUX的ssh免密码配置

    本篇将介绍LINUX的ssh免密码配置. 本篇中的有三台主机: 192.168.1.110 master.com.cn  主机192.168.1.111 salver1.com.cn192.168.1 ...

  7. centos 6.5 配置ssh免登录

    生成密匙: ssh-keygen -t rsa 会生成 id_rsa  id_rsa.pub id_rsa:私匙 id_rsa.pub:公匙 配置当前机器免登录: cp id_rsa.pub auth ...

  8. CentOS6.9下ssh密钥登录配置步骤(免密码登录)和ssh-keygen 命令常用参数

    密钥登录步骤(免密码登录)ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,出于安全方面的考虑,介绍密钥认证方式登录到linux/unix的方 ...

  9. Debian9.5下ssh密钥登录配置步骤(免密码登录)和ssh-keygen 命令常用参数

    密钥登录步骤(免密码登录)ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,出于安全方面的考虑,介绍密钥认证方式登录到linux/unix的方 ...

随机推荐

  1. zsh & for loop bug

    zsh & for loop bug ​for: command not found syntax error near unexpected token do' do' Unicode 编码 ...

  2. 如何用 js 实现一个 apply 函数

    如何用 js 实现一个 apply 函数 原理 实现方式 总结 refs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen ...

  3. umi

    umi https://github.com/umijs/umi https://umijs.org/zh/guide/ dva https://github.com/dvajs/dva https: ...

  4. css border-radius & yin-yang & taiji

    css border-radius & yin-yang & taiji solution css border-radius & tabs effect https://co ...

  5. dragable tabs & iframe & new window

    dragable tabs & iframe & new window https://www.npmjs.com/package/react-draggable-tab demo h ...

  6. Flutter 模拟youtube快进icon

    import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends State ...

  7. 万链互联时代,NGK DeFi项目如何在牛市中崭露头角!

    众所周知,中心化交易所存在技术风险.道德风险与法律风险.去中心化交易所像是NGK以其匿名性.安全性.私钥独立掌控的特点,弥补了中心化交易所的不足,我们看到Uniswap日成交量均超过1亿美元,甚至接近 ...

  8. HTML页面顶部出现空白部分(#65279字符?)解决办法

    1.在火狐下面用Firebug,选择body,点编辑html的时候,看到是多出了一个这个代表的意思,还真不知道,搜索后了解到是一种中文的编码规则,   UTF-8不需要BOM来表明字节顺序.   制作 ...

  9. TkMybatis添加对象后返回数据的id

    在实体类的id属性上加上下面的注解 //导入的包import javax.persistence.GeneratedValue; @GeneratedValue(generator = "J ...

  10. Java基本概念:接口

    一.简介 描述: 普通类只有具体实现,抽象类具体实现和规范都有,接口只有规范! 接口就是比抽象类还抽象的抽象类,可以更加规范的对子类进行约束,全面专业地实现了规范和具体实现的分离. 抽象类还提供某些具 ...