查找原始机器的 IP 或主机名 (ssh)

Geo*_*sic 10 linux ssh environment-variables hostname ssh-tunnel

我不断地从不同的物理位置(以及不同的物理机器)连接到许多机器。其中大部分是通过 ssh 完成的,有时需要一两台网关机器(我通过ProxyCommandin调用~/.ssh/config)。我想知道是否有一种方法可以识别远程端调用初始连接(即我正在使用的机器)的机器的 IP 或主机名?

  • 我不想发送环境变量,因为有些机器我没有 root 可以设置PermitUserEnvironment
  • $SSH_CLIENT环境变量是用于直接连接有用,但只列出最近的网关。

我目前对解决方案的想法是抓取$SSH_CLIENT,ssh 到它,找到该机器的$SSH_CLIENT值并重复直到它不存在;然后获取主机名并以某种方式将其拉回。

不过看起来有点像黑客工作;有人有更好的方法吗?

我主要在 bash shell 中工作,但我也很高兴任何不使用它的建议。

use*_*682 3

我从来没有尝试过,但我能想到一些可能有效的方法:你不要让 SSH 启动你的登录 shell,而是把事情掌握在你自己手中。您可以告诉 SSH 运行任意命令。代替

ssh remote_host
Run Code Online (Sandbox Code Playgroud)

你会按照以下方式运行一些东西

ssh remote_host -t "
    . /etc/profile; 
    . /etc/bash.bashrc; 
    DAT_ORIGIN_HOST=$(ifconfig eth0|grep -Po 't addr:\K[\d.]+') /bin/bash -l -i"
Run Code Online (Sandbox Code Playgroud)

它的作用是,它让 SSH 可以做其他事情,而不是启动登录 shell。该东西是一个字符串,它将作为命令远程运行。我们使用它以一种非常特殊的方式启动 shell:我们给它一个环境变量DAT_ORIGIN_HOST,其中包含 eth0 上的 ip(您可能需要更改它)。

我们执行的技巧是将要远程执行的命令放在 double qoutes 中"。双引号(至少在 Bash 中)意味着,在字符串传递到 SSH 之前,我们的 shell 会扫描它并在适当的情况下执行扩展/替换。这意味着我们的 shell 会将 `$(ifconfig ...) 部分计算为我们当前的 ip 地址,并向 ssh 传递一个字符串,其中包含带有我们本地 ip 地址的环境变量的定义。

登录到远程计算机后,echo $DAT_ORIGIN_HOST应打印您的 IP 地址。

为了开发对 SSH 的调用,我无耻地从这里获取了 IP 地址在这里获取了 -t 以及如何启动交互式内容

免责声明:我不确定-l-i选项/bin/bash。也许你需要忽略它们。