AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 536043
Accepted
alt
alt
Asked: 2013-09-04 13:00:45 +0800 CST2013-09-04 13:00:45 +0800 CST 2013-09-04 13:00:45 +0800 CST

~/.ssh/config 中的条件 ProxyCommand?

  • 772

我~/.ssh/config配置了各种主机,这些主机可以在我们公司的 VPN 上或通过 SSH 代理服务器访问。

目前我只有

Host internal-server
    ProxyCommand ssh -W internal.ip:22 external-server

但是,如果我在内部网络中,我可以直接访问内部 ip,因此通过外部服务器代理只会增加连接延迟。

如果内部IP无法访问,有没有办法可以临时代理,否则直接连接?

ssh
  • 8 8 个回答
  • 12385 Views

8 个回答

  • Voted
  1. Best Answer
    Zoredache
    2013-09-04T15:17:02+08:002013-09-04T15:17:02+08:00

    我通常设置这样的东西。它假定中间主机将能够解析名称。

    Host *%homeproxy
        ProxyCommand ssh user@proxyhost /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22
    

    所以我会连接到 like ssh blah%homeproxy。

    • 10
  2. domoarigato
    2019-01-03T04:58:32+08:002019-01-03T04:58:32+08:00

    我使用不同的方法来使用 Match。就我而言,如果它正在运行,我想使用本地代理,如果没有,我想使用它。以下指令很好地完成了这一点:

    Match Exec "nc -z 127.0.0.1 1086"
        ProxyCommand nc -X 5 -x 127.0.0.1:1086 %h %p
    

    它匹配每次 ssh 尝试,并执行快速检查,nc以查看我的代理是否已启动并在 1086 上运行(在这种情况下,nc退出时没有错误)。如果发生这种情况,它会设置 ProxyCommand。

    • 7
  3. Komeiji Kuroko
    2018-01-13T06:33:37+08:002018-01-13T06:33:37+08:00

    感谢@till 的回答,它给了我很多启发。

    我发现你可以强制重定向你的连接ProxyCommand nc dst dst-port。

    例如,B.com如果您使用,您实际上将连接到

    ssh A.com -o ProxyCommand="nc B.com 22"
    

    但UserKnownHostsFile仍会记录为A.com

    因此,您可以将域“auto”添加到您的ssh_config

    Host auto.internal-server
      Hostname {internal-server ip or domain}
      ProxyCommand bash -c '(timeout 0.1 nc -z %h %p) && nc %h %p || ssh -W %h:%p external-server'
    

    我替换nc -w 1 %h %p为(timeout 0.1 nc -z %h %p) && nc %h %p,如果您能在 100 毫秒内到达内部服务器,它会更快。

    或者您可以替换为ping,但如果您使用基于 TCP 的代理(如proxychains)或服务器不允许 ICMP 回显,则它可能表示错误信息。

    Host auto.internal-server
      Hostname {internal-server ip or domain}
      ProxyCommand bash -c '(ping %h &>/dev/null) && nc %h %p || ssh -W %h:%p external-server'
    

    您可以(timeout 0.1 nc -z %h %p)用任何检测您是否在内部服务器中的东西替换。

    如果您有多个候选 IP,即使您也可以使用:

    Host auto.internal-server
      Hostname {internal-server ip or domain}
      ProxyCommand bash -c 'f(){(timeout 0.1 ping -c 1 $1 &>/dev/null) && nc $1 %p;}; f 1.1.1.1 || f 2.2.2.2 || f 3.3.3.3'
    

    它将尝试连接1.1.1.1,如果失败尝试连接2.2.2.2,然后3.3.3.3。

    • 4
  4. kasperd
    2016-03-07T03:18:39+08:002016-03-07T03:18:39+08:00

    十年前,我为这种场景编写了一个代理命令。在您的用例中,我的代理命令可以这样使用:

    Host internal-server
        ProxyCommand ssh-multipath-proxy %h:%p -- ssh -W %h:%p external-server
    

    一些警告:我有点尴尬地承认,它不处理 IPv6,并且它只会尝试每个主机名的单个 IP 地址。此外,在发送服务器横幅之前,它不会将客户端横幅传输到服务器。但这不太可能引起问题。

    • 2
  5. till
    2016-03-07T01:58:52+08:002016-03-07T01:58:52+08:00

    这会更自动地工作一点点额外的 0.1 秒延迟:

    Host proxyhost.example.com
    ProxyCommand none
    
    Host *.example.com
    ProxyCommand sh -c "socat 2>/dev/null - tcp4:%h:%p,connect-timeout=0.1 || exec ssh -W  %h:%p proxyhost.example.com"
    
    • 1
  6. Hotsndot
    2021-02-12T02:31:31+08:002021-02-12T02:31:31+08:00

    (评论没有足够的声誉,所以另一个答案,无论如何都是这样。)

    除了domoarigato 回答谁使用Match exec添加代理命令之外,您也可以在Match host那里添加一个。这样,匹配执行将仅在该主机上执行,这非常重要,因为您希望 a) 此代理仅在此主机上,并且 b) 不会减慢您使用此命令对所有主机的 ssh 连接。它也不会更改用于 ssh 的名称,这对我的实际使用非常重要:在脚本、快捷方式、配置文件等中具有相同的 ssh 主机名。我想这是 OP 的主要愿望(至少它当我偶然发现这个问题时,是给我的)。

    我的 ssh_config 看起来像:

    Match host targetname !exec "nc -z -w 1 targethostname 22"
    ProxyCommand ssh proxyhostname -a -Y  nc -v %h 22
    
    Host targetname
    Hostname targethostname
    User username
    ForwardX11 yes
    

    (请注意,我还在端口扫描中添加了一个-w 1选项,该选项nc是一秒超时,因为过滤后的端口将永远使用此命令完成 - 即使 1 秒也可能令人厌烦,因此欢迎任何更好的解决方案!)

    • 1
  7. Sharath Srinivasan
    2018-11-13T06:37:52+08:002018-11-13T06:37:52+08:00

    我通常会创建另一个类似这样的条目——

    Host myVM
        ProxyCommand ssh -W internal.ip:22 external-server
        User ubuntu
    
    Host myVM-np
        User ubuntu
    

    然后根据您当前的代理环境调用您想要的那个。

    • 0
  8. schaman
    2020-07-16T14:24:13+08:002020-07-16T14:24:13+08:00

    使用 Match 和 Exec 可以检查 SSH 端口是否可访问,如果不能访问,则仅使用 ProxyCommand。在此处查看我的示例: https ://stackoverflow.com/questions/40746463/how-to-automatically-switch-ssh-config-based-on-local-subnet/62924483#62924483

    • 0

相关问题

  • 如何最好地设置 ssh 隧道以访问远程网络 (Linux)

  • SSH 和重定向

  • 通过 SSH 会话使用 NET USER 命令拒绝访问

  • SSH 服务器零日漏洞利用 - 保护自己的建议

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve