假设我有以下 ssh 会话:
userA@boxA -> userB@boxB -> userC@boxC
现在,从boxC
,作为userC
,我希望获得 ssh 连接来自的信息,userB@boxB
而该信息又来自userA@boxA
。
现在我有以下 ssh 会话以及第一个 ssh 会话:
userD@boxD -> userB@boxB
来自boxB
,因为userB
,我希望获得连接来自的信息userD@boxD
,并且有第二个 ssh 会话来自userA@boxA
。
这些信息是否可供用户使用和访问?它是否完全可用?
如果没有,是否有任何“简单”的方法可以提供这些信息?简单是指无需破解和重新编译 sshd,也无需在机器上拥有 root 访问权限。
答案1
从客户端向服务器发送环境变量的官方方式是通过SendEnv
和AcceptEnv
。问题是您需要在服务器上拥有 root 访问权限才能配置AcceptEnv
。大多数服务器配置为不接受或仅接受少数预定变量。
我发现了两种从客户端向服务器发送环境变量的技巧,这两种技巧都不需要服务器上的 root 访问权限。
技巧一:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME bash
这将连接到服务器,然后执行命令SSH_ORIGIN=$USERNAME@$HOSTNAME bash
,在客户端用$USERNAME
和$HOSTNAME
已经替换。然后,在服务器端,您可以进一步处理变量中包含的信息SSH_ORIGIN
。
是-t
需要的,否则 bash 将在没有 tty 的情况下在服务器上启动(尝试一下,你就会明白)。
稍加修改就能将信息沿着更长的 ssh 链传递。
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN bash
讨论:
- bash 作为交互式非登录 shell 启动(
.profile
未读取)。 - bash 运行两次(
.bashrc
读取两次)。一次由 sshd 执行,一次由用户命令执行。 - 它将始终启动 bash,忽略服务器上的默认 shell。
技巧二:
首先,您必须生成一个 ssh 密钥并将其传输到~/.ssh/authorized_keys
服务器上。然后在行前面添加command="$SHELL"
。有关更多信息,请参阅 sshd 手册页。
使用以下命令连接到 ssh 服务器:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME
这将连接到服务器,但这次不执行变量赋值。而是将字符串存储在环境变量中$SSH_ORIGINAL_COMMAND
。然后执行中提供的命令~/.ssh/authorized_keys
。一旦您进入 shell,您就可以处理中包含的信息$SSH_ORIGINAL_COMMAND
。
如上所述,您可以使其具有传递性:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN
讨论:
- 它将启动服务器上的默认 shell。
- 它将始终启动服务器上的默认 shell。您提供给 ssh 命令的任何命令都将被忽略并存储在中
$SSH_ORIGINAL_COMMAND
。如果您想通过 ssh 执行命令,您可以使用不同的 ssh 密钥或让您的 shell 初始化文件来检测和执行$SSH_ORIGINAL_COMMAND
。
答案2
该命令who
会告诉您现在还有谁登录在同一台计算机上以及他们从哪里登录。该命令last
会提供过去会话的相同信息。根据计算机配置和登录方法,这些信息可能不完整、不最新或不可供非 root 用户使用。
在您的 A@A->B@B->C@C 场景中,机器 C 不可能知道 B@B 已从 A 通过 ssh 会话登录到 B。在 20 世纪 80 年代,当每个人都信任每个人时,您可以尝试finger
或ident
,但如今机器 B 不太可能甚至运行 finger 或 ident 守护程序。
答案3
我认为您可以强制主机 B 上的环境变量写入主机 A 的地址。然后在主机 C 上使用 AcceptEnv 从主机 B 获取环境,瞧 :)
阅读一下 sshd_config,部分内容涉及环境内容。
答案4
从框 C,如果无法访问框 B,您将无法判断用户来自框 A。事实上,您可能无法判断用户如何到达框 C。这仅取决于管理员如何设置。
对于“进一步假设”的问题,答案相同。这取决于系统管理员授予您的权限以及他或她安装的程序。
如果您有权限(但您可能没有),相关命令将会对您有所帮助:
finger - http://www.manpagez.com/man/1/finger/
last - http://www.manpagez.com/man/1/last/