Linux安装SSH以远程连接

3,372 阅读9分钟

一般来说,Linux安装之后是自带ssh服务的,不过也有可能出现没有安装的情况。

1,安装SSH

执行下列命令即可:

sudo apt install ssh

一般来说,安装会包含以下软件包:

  • openssh-server SSH的服务端,安装后就可以远程连接本机
  • openssh-sftp-server SSH的SFTP协议服务端,安装后可以远程使用SFTP协议和本机传输文件
  • openssh-client SSH的客户端,可以用于连接别的机器

上述安装ssh的命令执行之后,一般上述几个软件包也会一起安装,若没有安装就手动安装一下即可。如果你的电脑仅需要连接其它机器,那么可以只安装openssh-client即可,反之如果当前机器只需要被远程连接,那么只安装openssh-server和openssh-sftp-server即可。

对于服务器端,也可以考虑使用下列命令最小化安装SSH服务端:

sudo apt install --no-install-suggests --no-install-recommends openssh-server

最后安装完成后,记得执行下列命令开启SSH服务端自启动:

sudo systemctl enable --now ssh

2,配置root用户远程密码连接

默认情况下,SSH不允许以root用户身份使用密码连接本机(但可以使用密钥对),可以通过修改配置解除该限制。

首先用文本编辑器打开/etc/ssh/sshd_config,这个是SSH服务端配置文件,找到#PermitRootLogin prohibit-password这一行:

image.png

改为:

PermitRootLogin yes

image.png

然后执行命令重启SSH服务端服务使得配置生效:

sudo service ssh restart

3,配置SSH密钥以免密登录

在使用ssh命令登录的时候通常要输入密码,不过可以通过配置SSH密钥对的方式实现免密登录会更加方便。

(1) 在本地生成密钥对

如果之前配置了Git的ssh密钥,则可以跳过生成密钥这一步,因为Git的ssh密钥本质上和这里的ssh密钥是一个东西。

在本地执行以下命令以生生成密钥对,在生成密钥对时,我们可以使用-t参数指定密钥算法类型,不同的密钥算法类型安全性不同,推荐使用ed25519和rsa算法,这里我将使用不同密钥算法的命令都放在下面,大家选其一即可:

# 使用ed25519算法生成密钥对
# 推荐使用该算法,更加短小现代,不过极少数老系统可能兼容不佳
ssh-keygen -t ed25519 -C "密钥名"

# 使用rsa算法生成密钥对
# 兼容性最好
ssh-keygen -t rsa -C "密钥名"

密钥名自己取,可以是邮箱也可以是随意的命名。

连按下三次回车就生成了!

密钥在如下位置生成:

  • Windows:C:\Users\你的用户名\.ssh目录下
  • Linux:/home/swsk33/.ssh目录下

a.png

私钥文件通常是无扩展名的,公钥文件则以pub为扩展名。如果你使用的是ed25519算法生成密钥,那么名称就分别是:

  • 私钥:id_ed25519
  • 公钥:id_ed25519.pub

(2) 将密钥配置到目标远程主机上

配置完成密钥之后,使用ssh-copy-id命令即可将本机公钥配置到目标远程主机上:

ssh-copy-id 目标主机用户名@目标主机地址

例如:

ssh-copy-id maiqu@10.15.120.205

就是把本机公钥配置到10.15.120.205的maiqu用户下。

image.png

这里需要输入目标主机的对应用户的密码,我这里就要输入远程主机的maiqu用户的密码。

配置完成之后,再次本电脑使用ssh命令登录该远程主机10.15.120.205的maiqu用户时,就不需要密码,可以直接连接上了!

上述ssh-copy-id命令,实际上就是干了一件事情:将你的公钥文件的内容(通常是一行字符串)写入到远程主机的对应用户的用户目录下的.ssh/authorized_keys文件中。authorized_keys文件是专门记录信任公钥的,里面每一行就是一个公钥。因此,你也可以把你的id_rsa.pub或id_ed25519.pub中的内容复制下来,追加粘贴到服务器的~/.ssh/authorized_keys中,也能实现一样的效果。

如果不想再让本机免密登录到该远程主机的该用户,则可以删除远程主机该用户目录下的这个文件,或者编辑该文件删除本机对应的公钥内容。

(3) 迁移SSH密钥对

这里我们在一台电脑上配置了密钥对并配置到了一台远程主机,如果我们换了一台电脑仍然想免密登录到该远程主机,只需将原电脑上生成的密钥对文件(上面提到的公钥和私钥文件)复制到新电脑的用户目录下的.ssh目录下即可,并配置正确的文件权限,密钥对文件位置在上面已经提过。

# 这里是新的电脑

# 创建.ssh目录(如果不存在)
mkdir ~/.ssh

# 复制原来电脑的密钥对文件
# 这里以rsa密钥为例
cp origin/path/to/id_rsa ~/.ssh/id_rsa
cp origin/path/to/id_rsa.pub ~/.ssh/id_rsa.pub

# 设置正确的权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

密钥文件权限要求:

  • .ssh目录本身:700
  • 公钥文件:644
  • 私钥文件:600

建议生成完成SSH密钥对后就将其备份一份,多个电脑使用一个密钥对更方便。

4,SSH常用命令

(1) 远程连接

打开终端,我们就可以直接使用ssh命令来连接远程主机,命令如下:

ssh 目标主机用户名@目标主机地址或域名

例如:

ssh maiqu@10.15.120.205

即远程登录10.15.120.205的maiqu用户。连接上会提示输入密码,输入远程登录的主机的用户密码即可(配置了上述的密钥对后,就不用输入密码直接连接了)。

登录成功后,可以看到终端最前面的用户名就变成远程主机的用户名和远程主机名了:

b.png

这时执行命令就是在远程主机执行,最后可以执行exit命令退出。

(2) 指定端口连接

ssh的端口默认是22,若远程主机用的别的端口作为ssh登录端口,则连接时可以用-p参数指定端口号:

# 指定连接222端口
ssh -p 222 maiqu@10.15.120.205

修改远程主机的配置文件/etc/ssh/sshd_config中的Port配置项即可修改端口,修改时记得先去掉配置项最前面的注释#,修改完成需要重启SSH服务。

ssh-copy-id配置公钥时,也可以使用-p指定端口。

(3) 压缩传输数据

连接时使用-C参数即可,这样传输的数据就是压缩后的:

ssh -C maiqu@10.15.120.205

(4) 使用X11转发功能

并非所有的程序都是命令行程序,如果我想执行远程主机上的带有图形界面的程序,只需在连接时加上-X参数打开X11转发功能即可。

首先需要先修改一下远程主机的ssh配置,编辑远程主机的/etc/ssh/sshd_config文件,找到X11Forwarding和X11UseLocalhost这两个配置项:

c

将两个配置项的前面的注释#都去掉,并修改它们为如下:

X11Forwarding yes
X11UseLocalhost no

ggg.png

保存,然后在远程主机执行下列命令以重启ssh服务:

sudo service ssh restart

然后就可以使用X11转发功能了!连接远程主机时加上-X参数即可:

ssh -X maiqu@10.15.120.205

运行一下远程主机上的Kate文本编辑器,效果如下:

image.png

5,指定密钥对文件

通过上述配置,我们知道密钥对文件默认生成在~/.ssh目录下,同时连接服务器时也是默认使用该目录下的密钥对文件完成。那么如果:

  • 密钥对文件不是标准名称(不是id_rsa等默认名称)
  • 密钥对文件不在~/.ssh目录下
  • ~/.ssh目录下有多对不同算法的密钥对文件(如同时存在私钥id_rsa和id_ed25519,以及公钥id_rsa.pub和id_ed25519.pub)

上述非默认的情况,可能行为就会有所不同。

(1) 存在多个默认名称密钥对文件

在连接服务器没有指定私钥时,SSH默认会查找用户~/.ssh/目录下的标准名称的私钥文件,例如:

~/.ssh/id_rsa
~/.ssh/id_ecdsa
~/.ssh/id_ecdsa_sk
~/.ssh/id_ed25519
~/.ssh/id_ed25519_sk

即:

  • 对于非标准命名的私钥,例如server1.key,默认不会自动使用
  • SSH会依次尝试可用的私钥,直到服务器接受某个私钥,或者全部认证失败

因此,如果你的私钥都是默认名称且都在~/.ssh目录下,那么即便生成了多个不同算法的密钥对也可以直接使用,SSH会自动尝试。

(2) 连接时指定私钥文件

如果你的私钥文件不在~/.ssh目录下,或者名称非默认标准名称,则可以在SSH连接时使用-i参数指定私钥文件:

ssh -i "/path/to/your-private-key" maiqu@10.15.120.205

此时,就会使用你指定的私钥文件去连接对应服务器,注意一定要指定私钥文件。

(3) ssh-copy-id配置时指定公钥文件

ssh-copy-id在安装公钥文件到远程服务器时,查找公钥文件的逻辑和上述SSH连接查找私钥文件是一致的。如果你的公钥文件不在默认目录下或者为非默认标准名称,同样也可以使用-i指定:

ssh-copy-id -i "/path/to/your-public-key" maiqu@10.15.120.205

这样,就会将你指定的公钥文件安装到对应的远程服务器,后续使用与其配套的私钥文件即可连接,注意这里就是要指定公钥文件了!