例如,如果有人想要访问路由器后面的本地网络上的一台计算机上的帐户 bob,他们只需键入:
$ ssh -p xx [email protected]`
但是,如何ssh
处理本地网络上两台机器具有相同用户名的可能性?是否有一个标志来区分机器 A 上的用户 bob 和机器 B 上的不同用户 bob,或者是否会ssh
抛出错误?
答案1
为什么要ssh
关心在不同主机上重复用户名?绝对预计会发生这种情况。提示:root
用户无处不在,不是吗?
因此,您的问题的答案是:ssh
以与其他所有内容相同的方式处理它:在与有问题的主机交谈之前不关心正在引用哪个用户。
上面的简化扩展:
首先发生的事情是ssh
客户端尝试与远程服务器建立对话ssh
。一旦打开通信通道,客户端就会查看它是否是已知主机(例如 中存在条目~/.ssh/known_hosts
),如果它是未知主机或具有无效凭据的已知主机(例如主机密钥已更改),则正确处理事情)。
现在所有这些都已完成,并且ssh
服务器和客户端之间的通信线路已正确打开,客户端将对服务器说“我想对用户进行身份验证bob
”。当然,服务器不会关心bob
网络上的任何其他服务器;只有它自己。
答案2
我认为戈登·戴维森的评论正确地指出了您的误解:
我认为这里存在一个根本性的误解:ssh 从不使用用户名来决定连接到哪台计算机。它只是连接到指定的目标 IP 地址(可能通过名称指定)和 TCP 端口号;它可能会被 NAT 路由器重定向到本地计算机,但如果是这样,这是根据 IP 和端口号而不是用户名完成的。
对于 SSH 的标准安装来说,这是 100% 正确的:如果您连接到 [email protected]
,它不会在任何其他主机上查找用户名。
但是,可以example.com
将连接重定向到另一台计算机。我有时会看到系统允许ssh
先连接,然后根据用户名进行重定向。然而,这不是标准的 SSH 行为,目标将完全取决于服务器上设置的重定向规则。
答案3
关于您的实际问题:
然而,ssh 如何处理本地网络上两台机器具有相同用户名的可能性呢?是否有一个标志来区分机器 A 上的用户 bob 和机器 B 上的不同用户 bob,或者 ssh 是否会抛出错误?
默认情况下,每个 Linux 系统都在 3 个文件中本地管理自己的用户、组和密码。
/etc/password
$ head -4 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin user1:x:1001:1001::/home/user1:/bin/bash
/etc/shadow
$ head -4 /etc/shadow root:$1$jmJYUghS$AxysSW9MzG6AmmweysZsi1::0:99999:7::: bin:*:17110:0:99999:7::: daemon:*:17110:0:99999:7::: user1:!!:17717:0:99999:7:::
/etc/group
$ head -4 /etc/group root:x:0: bin:x:1: daemon:x:2: user1:x:1001:
这些文件中包含实际数字。您可以在文件中的这一行看到它们/etc/password
:
user1:x:1001:1001::/home/user1:/bin/bash
这相当于 1001 和 1001 的用户 ID (UID) 和组 ID (GID)。如果我们要列出此目录的主目录user1
,您也会在那里看到这些相同的数字:
$ ls -lnd /home/user1
drwx------ 4 1001 1001 4096 Jul 12 00:05 /home/user1
笔记:在上面的命令中,我们指示ls
显示数字,否则默认显示名称:
$ ls -ld /home/user1
drwx------ 4 user1 user1 4096 Jul 12 00:05 /home/user1
SSH 怎么样?
当您ssh
连接到另一台服务器并包含登录用户时:
$ ssh [email protected]
您正在根据该服务器本地存储的有关给定用户的“详细信息”进行身份验证。使用 SSH 会稍微复杂一些,因为您通常会使用私钥/公钥对通过ssh
.
$ ls -l ~/.ssh/id_rsa*
-rw------- 1 root root 1675 Jul 21 00:50 /root/.ssh/id_rsa
-rw-r--r-- 1 root root 394 Jul 21 00:50 /root/.ssh/id_rsa.pub
在这种情况下ssh
,当您使用 SSH 密钥对的用户私有部分向远程服务器发送“秘密”时,服务器上是密钥对的公共部分,服务器可以使用该部分来确认您的身份事实上你就是你所说的那个人。
例如,这里是您的私钥部分:
我的笔记本电脑$ ssh-keygen -l -f ~/.ssh/id_rsa
2048 SHA256:HvNN38AS9H7tIHaaE+51lqv6bgL7AmyDdqHIZIyBimg root@centos7 (RSA)
如果我们寻找该用户能够ssh
使用密钥对的客户端:
$ ssh-keygen -l -f ~user1/.ssh/authorized_keys
2048 SHA256:HvNN38AS9H7tIHaaE+51lqv6bgL7AmyDdqHIZIyBimg root@centos7 (RSA)
注意按键匹配。