我很想知道是否有任何方法可以查明我是否处于嵌套 SSH 会话中以及其中有多少个会话?
例如,来自主机2 ssh user1@host1
然后从主机1 ssh user1@host2
最终在主机1,但实际上我可以退出去主机2。
我怎么知道我处于这种情况(在嵌套的 ssh 会话中),当然除了 exit 命令之外?
答案1
这不是一个完美的解决方案,因为并非所有 SSH 客户端都支持此功能;并且这些可以进行不同的配置。仍然…
转义字符
当请求伪终端时,
ssh
通过使用转义字符支持许多功能。单个波浪线字符可以作为波浪线
~~
字符发送,也可以在波浪线后面加上除下述字符以外的字符来发送。转义字符必须始终跟在换行符之后才能被解释为特殊字符。可以使用EscapeChar
配置指令在配置文件中或通过选项在命令行上更改转义字符-e
。支持的转义(假设默认
~
)是:[…]
~^Z
背景ssh
。[…]
~C
打开命令行。 [...]如果在 中启用了!command
该选项,则允许用户执行本地命令。使用该选项可以获得基本帮助。PermitLocalCommand
ssh_config(5)
-h
[…]
假设所有链接的 SSH 客户端都支持此功能,并且假设已请求伪终端,您可以通过观察在实际波浪号出现在当前命令行中之前“消耗”了多少波浪号字符来判断连接数。请记住,波形符必须始终跟在换行符之后才能被解释为特殊。我的测试表明每个连接都会消耗一个转义字符。
例如,如果Enter您需要发送~四次才能~
在屏幕上显示一个,则意味着存在三个链接连接。
Enter您可以通过发送、相应数量的~然后Ctrl+来将其中任何一个设置背景Z。这会将您置于相应的 shell 中,您可以在其中调查您来自哪里 ( env | grep ^SSH_
)、您在哪里 ( uname -a
、hostname
、...) 以及后台命令是什么 ( jobs
)。运行fg
以恢复连接。你能做什么取决于 shell 以及你如何运行相应的ssh
,我不会详细说明。
如果有一个转义函数可以ssh
打印有关连接的基本信息(类似于~#
),那就太好了。似乎还没有这样的功能。
使用~C
(C
此处表示大写 C,Shift+ C),!command
您可以在不ssh
向后台发送任何内容的情况下进行调查。注意默认值PermitLocalCommand
是no
。 AFAIK 连接建立后无法更改它,所以请提前考虑。