Qingquan-Li / blog

My Blog
https://Qingquan-Li.github.io/blog/
132 stars 16 forks source link

SSH登录远程主机 #130

Open Qingquan-Li opened 4 years ago

Qingquan-Li commented 4 years ago

参考:

环境:

SSH(Secure Shell)作用:

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 密钥:

如果没有现成的公钥和私钥,可以直接用 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 读写权限:

$ 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 文件的末尾就行了。