Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SSH登录远程主机 #130

Open
Qingquan-Li opened this issue Nov 20, 2019 · 0 comments
Open

SSH登录远程主机 #130

Qingquan-Li opened this issue Nov 20, 2019 · 0 comments
Labels

Comments

@Qingquan-Li
Copy link
Owner

Qingquan-Li commented Nov 20, 2019

参考:

环境:

  • 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 fatli@192.168.73.192
fatli@192.168.73.192'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 fatli@192.168.31.126
fatli@192.168.31.126'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 fatli@liqingquandeMacBook-Air.local
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 fatli@192.168.73.192
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 文件的末尾就行了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant