Linux SSH远程访问

SSH 是什么

SSHOpenSSH Secure Shell通用的简称,OpenSSH Secure Shell(SSH)是用来在远程设备的操作系统上安全运行Shell,只需要提供远程目的设备系统的用户信息并且完成身份认证就可以对登录到该系统执行命令了。

SSH的食用方法

1
2
3
4
ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J destination] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path]
[-W host:port] [-w local_tun[:remote_tun]] destination [command]

这么看的话选项和参数有点多!不过常用的仅仅几个,下面的例子会介绍SSH的常见使用方法。

默认SSH服务器的远程端口是22,也就是说在没有指定[-p port]选项时假定ssh服务端口就是22。如果你出于安全考虑,将OpenSSH服务器上对外暴露的端口修改为其他端口号上,那么在远程访问服务器时使用ssh需要手动指定-p 端口号才能与你的SSH服务器建立连接。

登录远程设备系统

使用远程系统的用户名来登录远程设备系统

ssh <username>@<remote_address>

参数1(username):指定要登录到远程设备的用户名

参数2(remote_address):远程设备的IP地址或域名

例如:

ssh root@yeefire.com

root用户身份(用户名)来登录yeefire.com域名的IP所指向的远程服务器系统。

使用当前用户身份,登录远程设备的系统

ssh yeefire.com

使用你执行ssh命令的这个用户身份来登录到yeefire.com上,假定你现在的用户身份名为root那么可以理解为上面的命令被解析为ssh root@yeefire.com

使用w命令看看谁现在登陆了这台系统

w

1
2
3
4
5
w

14:55:29 up 17:01, 1 user, load average: 1.39, 1.49, 1.52
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
pi pts/2 192.168.1.194 12:53 0.00s 0.11s 0.01s w

在上面可以看到,用户名,使用的是什么终端,从些远程位置进行了登录以及登陆时间。

SSH公钥

为了确保与服务器之间保持安全的网络通信,当从SSH客户端登录远程设备系统时,在该客户端开始登陆前,客户端会向目标索取服务器公钥,如果第一次与服务器链接会让你确认服务器公钥的准确性(防止中间人攻击),一旦接受了公钥,就会保存在~/.ssh/known_hosts文件中,并且每次与远程设备系统设备链接时会与本机系统第一次保存的公钥进行比对,如果发现不匹配则立即拒绝并断开链接,并假定网络通信已遭劫持或服务器被入侵。

但是,当你给远程的设备重做了系统,由于重新生成了公钥会和你本机系统SSH客户端存储的公钥不一致,所以也会断开连接。如果你确信你当前的网络不存在安全问题,你可以在~/.ssh/known_hosts文件中删除旧的公钥记录,便可以重新与远程服务器进行建立可靠连接并登录。

配置SSH免密登录

使用公钥身份验证即可对SSH登录进行身份验证,而不需要输入密码。执行ssh-keygen命令生成密钥,其中生成的私钥保存在~./ssh/id_rsa,公钥保存在~./ssh/id_rsa.pub

注意,你的私钥一定要保存好,它现在相当于你的登录密码!如果私钥被盗取,那么其他人可以利用你的私钥毫不客气地远程SSH登录到你的系统并窃取你珍藏许久的小电影。

下面是配置免密SSH登录的顺序和例子:

ssh-keygen生成密钥

在你的本机系统上执行 ssh-keygen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): # 回车
Enter passphrase (empty for no passphrase): # 回车
Enter same passphrase again: # 回车
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:0kyfGMx571yKfjmtmMwnEYeJp2BYgf5yi0qWXCr18/k username@centos8
The key's randomart image is:
+---[RSA 3072]----+
| ... |
| . .o . |
| . o *..o |
| o o+.==o. |
| . .o..Sooo. . |
| o =. o.. .+ o |
|. * o+ . ..+o |
| + .o.. +.o= . |
| .. o.E *+.o |
+----[SHA256]-----+

在生成密钥的过程中,会询问你密钥保存位置。也会询问你”二次认证”的密码(不需要再为私钥设置密码,全部回车即可!我们目的就是配置免密登录。如果你此处输入了密码,那么在使用私钥认证的时候仍然需要进行密码认证。但是设置私钥密码的好处是当你私钥被盗后,你有时间在对方破解你的私钥密码时重新生成一对密钥来保护你的系统)。此处全部直接回车即可。

ssh-copy-id发送公钥

现在已经生成了本机的私钥与公钥,将本机的公钥发送给你的远程设备系统即可实现免密登录。

ssh-copy-id <username>@<remote_address>

参数1(username):指定要登录到远程设备的用户名

参数2(remote_address):远程设备的IP地址或域名

之后输入SSH登录密码,便会将公钥发送到远程设备的默认公钥存储位置存储。

现在,你当你ssh <username>@<remote_address>时,你会发现不需要输入密码即可登录到远程设备的系统上了。