如何获取用于建立 ssh 连接的完整用户名?

如何获取用于建立 ssh 连接的完整用户名?

ForceCommand当用户使用 ssh 连接到服务器时,我用来运行以下脚本:

#!/bin/bash

echo "$USER logged in" > /home/testuser/ssh_info

/bin/bash

现在我尝试登录,ssh testuser:20@<ip>然后输入 testuser 的密码并登录。SSH 连接已成功建立,但 $USER 是testuser但不是testuser:20

如何获取 testuser:20 而不仅仅是 testuser 的信息?我想根据传递的整数打开不同的外壳。

我知道这是可能的,因为 Cisco SSH 服务器具有类似的功能:OpenSSH 客户端中用户名后的整数,以冒号分隔

答案1

如果你运行ssh testuser:20@<ip>,那么“ssh”程序——我假设它是开放SSHversion--将“testuser:20”传输到远程 SSH 服务器作为连接的登录名。

SSH 服务器可以随意解释登录名。 OpenSSH 服务器记录从客户端接收到的完整登录名,然后丢弃登录名中的冒号及其后面的任何文本:

if ((r = sshpkt_get_cstring(ssh, &user, NULL)) != 0 ||
    (r = sshpkt_get_cstring(ssh, &service, NULL)) != 0 ||
    (r = sshpkt_get_cstring(ssh, &method, NULL)) != 0)
    goto out;
debug("userauth-request for user %s service %s method %s", user, service, method);
debug("attempt %d failures %d", authctxt->attempt, authctxt->failures);

if ((style = strchr(user, ':')) != NULL)   <-- Check for a colon
    *style++ = 0;                          <-- Discard it

因此,在会话的剩余时间内,包含冒号和以下文本的名称不可用。

似乎使用 OpenSSH 服务器更改此行为的唯一方法是更改​​ ssh 服务器程序的源代码并使用更改后的版本。OpenSSH 是开源的,所以如果该功能对您来说足够重要,那么这是一个选项。

或者,您可以查看替代的 ssh 服务器(其中大部分或全部都是商业产品),看看其中一个是否提供此功能。

答案2

通常的 Linux 发行版通常不支持此类用户名,请参阅https://unix.stackexchange.com/a/157431/330987

相关内容