如何找出发起 ssh 连接的用户的用户名?
假设我从 userA@machine1 ssh 到 userB@machine2。现在我在 machine2 上,如何找到 userA 的用户名?我可以访问(但并不总是 root 访问权限)这两台机器。理想情况下,这不需要在 machine1 上进行任何特殊设置,但如果这不可能,那么我愿意接受任何解决方案。
答案1
假设双方都是Linux:
在 machine2 上运行
netstat -nt
并查找来自 machine1 的连接。它看起来像这样:tcp 0 48 10.243.18.22:22 10.48.209.120:54875 ESTABLISHED
第一个ip:port是本地机器(即machine2)上的地址和端口,第二个是远程机器(本例中为machine1)上的地址和端口。
登录到 machine1。运行(以 root 身份)
netstat -tpn | grep 54875
(54875
上一步中找到的端口在哪里)。这将向您显示原始 ssh 进程的 PID,您可以从中轻松使用该ps
命令确定用户。
如果您在原始系统上运行 ident 守护程序,则可以避免很多此类工作,但 (a) 没有多少人这样做,因为它会暴露有关您的用户的信息,并且 (b) 知道如何做到这一点会很好。
答案2
你需要知道或想知道吗?我是从技术角度说的,因为如果没有远程计算机(您的设置中为“machine1”)的 root 访问权限,就无法获得权威信息。但是,您可能能够做出合理的猜测。如果这些信息是有用的,那么这很有帮助,但对安全来说却没有好处。
守护进程ident
是运行该程序的老式方法,但由于在当今世界,将用户信息免费分发给不受信任的站点毫无意义,因此现代 identd 实现通常会提供加密结果。这可以使用系统本身保存的秘密进行解密。但现在更常见的情况是,人们根本不运行 ident 守护进程。
如果您在 machine1 上有 root 权限,则可以运行带加密的 identd,并使用 machine2 上的密钥来查找答案。或者您可以按照netstat
larsks 建议的方式操作。但是如果您没有 root 权限,则可以查看非 root 权限进程,并根据时间做出有根据的猜测。
或者,您可以从不同的角度来处理这个问题。如果您关心的是身份保证,那么某种基于时间或计数器的加密 OTP 解决方案可能会让您可以合理地确定连接的远程用户是他们应该连接的人,无论他们连接到什么。
答案3
这由身份在端口上运行的守护进程auth
(authd、oidentd、pidentd 等)。
答案4
你不能简单地在 machine2 上运行 ps -aux 吗?
我从 Machine1 通过 SSH 进入 Machine2,以下是输出。我甚至对 root 执行了 su,我可以看到我连接的原始 UID。
root 31519 0.1 0.1 6512 1940 ? Ss 10:56 0:00 sshd: eric [priv]
eric 31521 0.0 0.1 6512 1224 ? S 10:56 0:00 sshd:eric@pts/0