使用Linux,你只须要在按键上输入命令,就可以巧妙地使用计算机(甚至这台计算机可以在世界上任何地方),这正是Linux最吸引人的特点之一。有了OpenSSH,POSIX用户就可以在有权限联接的计算机上打开安全壳体合同,之后远程使用。这对于许多Linux用户来说可能不过是日常任务,但从没操作过的人可能还会倍感很苦恼。本文介绍了怎样配置两台计算机的安全壳体合同(secureshell)(简称SSH)联接,以及怎样在没有密码的情况下安全地从一台计算机联接到另一台计算机。
相关术语
在讨论多台计算机时,怎样将不同计算机彼此区分开可能会让人难受。IT社区拥有健全的术语来描述计算机联网的过程。
◈服务(service):服务是指在后台运行的软件,因而它不会局限于仅供安装它的计算机使用。诸如,Web服务器一般托管着Web共享服务。该术语隐含(但非绝对)它是没有图形界面的软件。◈主机(host):主机可以是任何计算机。在IT中,任何计算机都可以称为主机,由于从技术上讲,任何计算机都可以托管(host)对其他计算机有用的应用程序。你可能不会把自己的电脑笔记本视为主机,但毕竟里面可能正运行着一些对你、你的手机或其他计算机有用的服务。◈本地(local):本地计算机是指用户或个别特定软件正在使用的计算机。比如,每台计算机就会把自己称为localhost。◈远程(remote):远程计算机是指你既没在其面前,也没有在实际使用的计算机,是真正意义上在远程位置的计算机。
如今术语早已明晰好,我们可以开始了。
在每台主机上激活SSH
要通过SSH联接两台计算机,每位主机都必须安装SSH。SSH有两个组成部份:本地计算机上使用的用于启动联接的命令,以及用于接收联接恳求的服务器。有些计算机可能早已安装好了SSH的一个或两个部份。验证SSH是否完全安装的命令因系统而异,因而最简单的验证方式是查阅相关配置文件:
$ file/etc/ssh/ssh_config
/etc/ssh/ssh_config: ASCII text
假如返回Nosuchfileordirectory错误,说明没有安装SSH命令。
SSH服务的检查与此类似(注意文件名中的d):
$ file/etc/ssh/sshd_config
/etc/ssh/sshd_config: ASCII text
按照缺位情况选择安装两个组件:
$ sudo dnf install openssh-clients openssh-server
在远程计算机上,使用systemd命令启用SSH服务:
$ sudosystemctl enable --now sshd
你也可以在GNOME上的系统设置或macOS上的系统首选项中启用SSH服务。在GNOME桌面上,该设置坐落共享面板中:
在GNOME系统设置中激活SSH
开启安全壳体合同
如今你早已在远程计算机上安装并启用了SSH,可以尝试使用密码登入作为测试。要访问远程计算机,你须要有用户账户和密码。
远程用户毋须与本地用户相同。只要拥有相应用户的密码,你就可以在远程机器上以任何用户的身分登入。比如,我在我的工作计算机上的用户是sethkenlon,但在我的个人计算机上是seth。假如我正在使用我的个人计算机(即作为当前的本地计算机),而且想通过SSH联接到我的工作计算机,我可以通过将自己标示为sethkenlon并使用我的工作密码来实现联接。
要通过SSH联接到远程计算机,你必须晓得其IP地址或可解析的主机名。在远程计算机上使用ip命令可以查看该机器的IP地址:
$ ip addr show | grep"inet "
inet 127.0.0.1/8 scope host lo
inet 10.1.1.5/27 brd 10.1.1.31[...]
假如远程计算机没有ip命令,可以尝试使用ifconfig命令(甚至可以试试Windows上通用的ipconfig命令)。
127.0.0.1是一个特殊的地址,它实际上是localhost的地址。这是一个环回(loopback)地址,系统使用它来找到自己。这在登陆远程计算机时并没有哪些用,因而在此示例中linux多线程编程,远程计算机的正确IP地址为10.1.1.5。在现实生活中,我的本地网路正在使用10.1.1.0子网,从而可获知前述正确的IP地址。假如远程计算机在不同的网路上,这么IP地址几乎可能是任何地址(但绝不会是127.0.0.1),但是可能须要一些特殊的路由能够通过各类防火墙抵达远程。假如你的远程计算机在同一个网路上,但想要访问比自己的网路更远的计算机,请阅读我之前写的关于在防火墙中打开端口的文章。
假如你能通过IP地址或主机名ping到远程机器,而且拥有登入账户,这么就可以通过SSH接入远程机器:
$ ping-c1 10.1.1.5
PING 10.1.1.5(10.1.1.5) 56(84) bytes of data.
64 bytes from10.1.1.5: icmp_seq=1 ttl=64time=4.66 ms
$ ping-c1 akiton.local
PING 10.1.1.5(10.1.1.5) 56(84) bytes of data.
至此就成功了一小步。再试试使用SSH登陆:
$ whoami
seth
$ ssh sethkenlon@10.1.1.5
bash$ whoami
sethkenlon
测试登陆有效,下一节会介绍怎么激活无密码登入。
创建SSH秘钥
要在没有密码的情况下安全地登陆到另一台计算机linux 远程连接,登陆者必须拥有SSH秘钥。可能你的机器上早已有一个SSH秘钥,但再多创建一个新秘钥也没有哪些益处。SSH秘钥的生命周期是在本地计算机上开始的,它由两部份组成:一个是永远不会与任何人或任何东西共享的公钥,一个是可以复制到任何你想要无密码访问的远程机器上的私钥。
有的人可能会创建一个SSH秘钥,并将其用于从远程登陆到GitLab身分验证的所有操作,但我会选择对不同的任务组使用不同的秘钥。比如,我在家里使用一个秘钥对本地机器进行身分验证linux 远程连接,使用另一个秘钥对我维护的Web服务器进行身分验证,再一个单独的秘钥用于Git主机,以及又一个用于我托管的Git储存库,等等。在此示例中,我将只创建一个惟一秘钥,以在局域网内的计算机上使用。
使用ssh-keygen命令创建新的SSH秘钥:
$ ssh-keygen -t ed25519 -f ~/.ssh/lan
-t选项代表类型,上述代码设置了一个低于默认值的秘钥加密级别。-f选项代表文件linux命令vi,指定了秘钥的文件名和位置。运行此命令后会生成一个名为lan的SSH公钥和一个名为lan.pub的SSH私钥。
使用ssh-copy-id命令把私钥发送到远程机器上,在此之前要先确保具有远程计算机的SSH访问权限。假如你没法使用密码登入远程主机,也就难以设置无密码登入:
$ ssh-copy-id-i ~/.ssh/lan.pub sethkenlon@10.1.1.5
过程中系统会提示你输入远程主机上的登陆密码。
操作成功后,使用-i选项将SSH命令指向对应的秘钥(在本例中为lan)再度尝试登陆:
$ ssh-i ~/.ssh/lan sethkenlon@10.1.1.5
bash$ whoami
sethkenlon
对局域网上的所有计算机重复此过程,你就将才能无密码访问这个局域网上的每台主机。实际上,一旦你设置了无密码认证,你就可以编辑/etc/ssh/sshd_config文件来严禁密码认证。这有助于避免其他人使用SSH对计算机进行身分验证,除非她们拥有你的公钥。要想达到这个疗效,可以在有sudo权限的文本编辑器中打开/etc/ssh/sshd_config并搜索字符串PasswordAuthentication,将默认行修改为:
PasswordAuthenticationno
保存并重启SSH服务器:
$ sudosystemctl restart sshd&& echo"OK"
OK
$
日常使用SSH
OpenSSH改变了人们对操作计算机的想法,使用户不再被禁锢在面前的计算机上。使用SSH,你可以访问屋内的任何计算机,或则拥有账户的服务器,甚至是联通和物联网设备。充分借助SSH也意味着解锁Linux终端的更多用途。假如你还没有使用过SSH,请试一下它吧。试着适应SSH,创建一些适当的秘钥,借此更安全地使用计算机,打破必须与计算机面对面的局限性。
本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!