Thanks to visit codestin.com
Credit goes to github.com

Skip to content

SSH登录远程主机 #130

@qingquan-li

Description

@qingquan-li

参考:

环境:

  • macOS
  • Linux(Ubuntu)
  • SSH
    SSH 只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是 OpenSSH,它是自由软件,应用非常广泛。使用 $ ssh -V 可查看到 macOS和Ubuntu 默认安装了 OpenSSH。

SSH(Secure Shell)作用:

  • SSH是一种网络协议,用于计算机之间的加密登录。
  • 配置好本地主机和远程主机的 SSH 后,我们可以在本地主机使用 $ ssh username@server 登录远程主机。或者,可以通过 git ,向远程主机进行 git push 提交代码等操作。

SSH 登录语法:

$ ssh username@server


一、SSH登录(密码登录)

实例:SSH登录局域网内的电脑(密码登录)

这里登录的远程主机是我装在 macOS 虚拟机上 Ubuntu ,在 Ubuntu 终端上使用 ifconfig 即可查看局域网 ip 地址

$ ifconfig
# ...
inet addr:192.168.73.192  Bcast:192.168.73.255  Mask:255.255.255.0
# ...

回到本地电脑(这里是macOS)终端进行 ssh 连接。注意:fatli 是我在远程主机 ubuntu 的用户账号,请替换成自己主机的用户账号。

$ ssh [email protected]
[email protected]'s password:
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-21-generic x86_64)
# ...
Last login: Mon Feb 11 11:56:54 2019 from 192.168.73.1
fatli@fatli-vm-ubuntu:~$

因为此处没有将本地主机(这里是macOS)公钥 ~/.ssh/id_rsa.pub 配置到远程主机(这里是局域网内的ubuntu) ~/.ssh/authorized_keys ,所以需要输入远程主机用户密码。


附:虚拟机的桥接模式(与本文教程无关,可忽略)

虚拟机(这里是 Ubuntu )得到以上 IP 地址( 192.168.73.192 )的网段 73 不同于宿主主机(这里是 macOS)的 IP 地址(192.168.31.58)的网段31,是因为,这里安装 Ubuntu 使用的虚拟机软件是 VMware Fusion ,虚拟机网络模式默认为 NAT 模式,所以分配了一个不同于宿主主机(这里是 macOS)网段的 IP 地址。
如果虚拟机(这里是 Ubuntu )除了对宿主主机(这里是 macOS )提供服务外,还需要对局域网其他电脑提供服务(例如提供 HTTP 或 FTP 或 SSH 服务),那么就要选择桥接模式。
虚拟机(这里是 Ubuntu )选择桥接模式:虚拟机资源库选中Ubuntu => 设置 => 网络适配器 => Internet共享 - 与我的 Mac 共享 => 切换为,桥接模式网络连接 - 选中 Wi-Fi 。

$ # 在虚拟机 Ubuntu 上操作
$ ifconfig
# ...
inet addr:192.168.31.126  Bcast:192.168.31.255  Mask:255.255.255.0
# ...
$ # 在宿主主机 macOS 上操作
$ ssh [email protected]
[email protected]'s password:
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-21-generic x86_64)
# ...
Last login: Fri Nov 22 20:35:41 2019 from 192.168.31.58
fatli@fatli-vm-ubuntu:~$


二、SSH登录(公钥登录)

SSH 提供了公钥登录,可以省去输入密码的步骤。

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。即是,将本地主机公钥 ~/.ssh/id_rsa.pub 配置到远程主机 ~/.ssh/authorized_keys
使用 cat 命令,添加 id_rsa.pub 到 server 中的 authorized_keys 文件中,参见下面 实例1:SSH登录局域网内的电脑(公钥登录)

原理:

登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥 ~/.ssh/id_rsa 加密后,再发回来。远程主机用事先储存的公钥 ~/.ssh/id_rsa.pub 进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。


SSH 密钥位置:

默认情况下,用户的 SSH 密钥存储在其 ~/.ssh 目录下。

  • 公钥 ~/.ssh/id_rsa.pub

  • 私钥 ~/.ssh/id_rsa


生成 SSH 密钥:

如果没有现成的公钥和私钥,可以直接用 ssh-keygen 生成一对:

$ ssh-keygen

首先 ssh-keygen 会确认密钥的存储位置(默认是 ~/.ssh),一路回车即可。然后它会要求你输入两次密钥口令,要不要对私钥设置口令(passphrase)?如果担心私钥的安全,这里可以设置口令。如果你不想在使用密钥时输入口令,将其留空即可。

运行结束以后,在 /home/用户名/.ssh/ 目录下,会新生成两个文件: id_rsa.pubid_rsa ,前者是你的公钥,后者是你的私钥。

注意:因为此时是使用 $ ssh username@server 登录 Ubuntu : ~ 等价 /home/用户名
如果切换到 root 用户身份,~ 则等价 /root
使用 $ pwd 可以查看当前目录路径。
在 macOS 中: ~ 等价 /Users/用户名


实例1:SSH登录局域网内的电脑(公钥登录)

将本地主机公钥 ~/.ssh/id_rsa.pub 配置到远程主机 ~/.ssh/authorized_keys ,实现公钥登录,无需输入远程主机用户密码。

# ssh密码登录远程主机后:
fatli@fatli-vm-ubuntu:~$ cd ~/.ssh/
fatli@fatli-vm-ubuntu:~/.ssh$ ls
known_hosts
# cat > 文件名:创建文件并进入编辑模式(Control + D 2次退出编辑)
fatli@fatli-vm-ubuntu:~/.ssh$ cat > authorized_keys
ssh-rsa AAAAB3NzaC1yc2......ZDaKlsPOcHgSMKAfXXf9vd7D [email protected]
fatli@fatli-vm-ubuntu:~/.ssh$ ls
authorized_keys  known_hosts
fatli@fatli-vm-ubuntu:~/.ssh$ logout
Connection to 192.168.73.192 closed.
# 使用ssh公钥登录(不再需要输入远程主机用户密码)
➜  /Users/fatli > ssh [email protected]
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-21-generic x86_64)
# ...
Last login: Wed Nov 20 22:20:59 2019 from 192.168.73.1

追加公钥 id 到服务器的 authorized_keys 文件中(不要使用 vim 直接添加 id_rsa.pub ):

$ cat >> authorized_keys
# 粘贴 id_rsa.pub 中的公钥 id , Control + D 退出编辑

实例2:SSH登录云服务器

$ ssh -q -l ubuntu -p 22 <腾讯云 CVM IP 地址> # ssh登录腾讯云Ubuntu服务器

主要参数说明:

-l 指定登入用户(这里的用户指的是服务器登录用户名 username@server)
-p 设置端口号( 22 是 SSH 默认使用的端口号)
-f 后台运行,并推荐加上 -n 参数
-n 将标准输入重定向到 /dev/null,防止读取标准输入
-N 不执行远程命令,只做端口转发
-q 安静模式,忽略一切对话和错误提示
-T 禁用伪终端配置

$ logout # 断开服务器连接


三、设置 .ssh 目录和秘钥文件权限

除了文件所有者外,其他用户不可读、写、执行 .ssh 目录及目录中的 authorized_keys ,这也很好理解,如果其他用户有了 .ssh 目录或目录下的 authorized_keys 读写权限:

  • 可以阅读 id_rsa 私钥,那私钥的保密性就荡然无存;
  • 可以把远程主机上的 authorized_keys 随意替换成自己生成的公钥,就可以通过 ssh 登录。
    所以,使用 ssh 登录之前,应该在远程和本地主机上执行以下命令:
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_rsa

查看文件权限:

$ ls -la

例如,当前使用 $ ssh username@server 登录 Ubuntu ,如果当前文件权限属于 root 用户,当前的 username 用户则无法进行读写等操作。
如需进行读写等操作,则需要切换到 root 用户( $ sudo passwd root 设置 root 密码 => $ su - 切换到 root 用户);或进入权限属于 username 用户的文件进行读写操作,例如 $ cd 进入 ~ (此时 ~ 等价 /home/username )。

查看更多 Linux 文件权限:
鳥哥的 Linux 私房菜 - Linux 的檔案權限與目錄配置

收集所有需要登录的用户的本地主机公钥,即用户们的 ~/.ssh/id_rsa.pub 文件,把所有公钥导入到服务器的 ~/.ssh/authorized_keys 文件里,一行一个。( 因为此时是使用 $ ssh username@server 登录 Ubuntu : ~ 等价 /home/用户名
公钥就是一段字符串,只要把它追加在 ~/.ssh/authorized_keys 文件的末尾就行了。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions