I am trying to use OpenSSH ProxyCommand on Windows to connect to device2 through device1. Device2 requests xxxxx port forwarding and connection without ProxyCommand works fine (but requires first connecting to device1 and then device2, and I want easy, one step connection).
I've created C:\Program Files\OpenSSH\etc\ssh_config file as following:
Host device1 Hostname xxx.xxx.xx.xx User root Host device2 ProxyCommand ssh -q device1 nc -q0 localhost xxxxx Now when I type
ssh user@device2 I get
/bin/sh: No such file or directory write: Broken pipe I have checked this on Linux OS and it worked just fine. Could you please explain what might me wrong?
Additionally I've also tried creating config in C:\Program Files\OpenSSH\home\user\.ssh\config and got the same result.
When I delete config file then I get
ssh: Could not resolve hostname device2: Name or service not known So the file seems to be detected.
I am using OpenSSH_7.6p1, OpenSSL 1.0.2k 26 Jan 2017, and Windows 10
94 Answers
I fought with this today beacuse I wanted to use ProxyJump in Windows. The problem seems to be that the openssh in Windows might call the wrong ssh which did not work for me.
λ ssh.exe -v target-via-pj OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5 debug1: Reading configuration data C:\\Users\\nico/.ssh/config debug1: C:\\Users\\nico/.ssh/config line 41: Applying options for target-via-pj debug1: Setting implicit ProxyCommand from ProxyJump: ssh -v -W '[%h]:%p' my-proxy debug1: Executing proxy command: exec ssh -v -W '[XXX.XXX.XXX.XXX]:22' my-proxy CreateProcessW failed error:2 posix_spawn: No such file or directory What works for me is specifying the ProxyCommand explicitly. Here is my definition in Windows of my proxy and target.
Host my-proxy HostName 192.168.66.22 User user IdentityFile ~/.ssh/id_rsa Host target-via-pj Hostname XXX.XXX.XXX.XXX User user ProxyCommand ssh.exe -W %h:%p proxy IdentityFile ~/.ssh/id2_rsa This leads to:
λ ssh.exe -v target-via-pj OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5 debug1: Reading configuration data C:\\Users\\nico/.ssh/config debug1: C:\\Users\\nico/.ssh/config line 41: Applying options for target-via-pj debug1: Executing proxy command: exec ssh.exe -W XXX.XXX.XXX.XXX:22 proxy debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\nico/.ssh/id_rsa type -1 debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\nico/.ssh/id_rsa-cert type -1 debug1: Local version string SSH-2.0-OpenSSH_for_Windows_7.7 debug1: Remote protocol version 2.0, remote software version OpenSSH_7.6p1 Ubuntu-4ubuntu0.3 debug1: match: OpenSSH_7.6p1 Ubuntu-4ubuntu0.3 pat OpenSSH* compat 0x04000000 debug1: Authenticating to XXX.XXX.XXX.XXX:22 as 'user' Hope that helps!
Ok so I think I figured this out, although my problem is not solved, as it can't be.
From my research and thanks to I learned that there is no build of OpenSSH for Windows with support of ProxyCommand (at least I couldn't find one, and on their site is such info).
The reason I got:
/bin/sh: No such file or directory write: Broken pipe Was because of bad OpenSSH build. I downloaded it from
https ://
And according to the reviews there, this build is broken! Please do not use it! After I uninstalled this OpenSSH and installed official one from the website (or from Windows 10 optional functions) I got correct error:
Proxy connect is not supported in Windows yet With Windows 10 1903 and , ProxyCommand should work fine, i think you can do this now, below is sample command for HTTP proxy, hope this can give some help,
ssh -o "ProxyCommand C:\Program Files (x86)\Nmap\ncat.exe --verbose --proxy-type http --proxy 127.0.0.1:10801 %h %p" -v Full log:
C:\Users\xxx>ssh xxx.xxx -p 22 -o "ProxyCommand C:\Program Files (x86)\Nmap\ncat.exe --verbose --proxy-type http --proxy 127.0.0.1:10801 %h %p" -v OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5 debug1: Reading configuration data C:\\Users\\xxx/.ssh/config debug1: C:\\Users\\xxx/.ssh/config line 2: Applying options for xxx.xxx debug1: Executing proxy command: exec C:\\Program Files (x86)\\Nmap\\ncat.exe --verbose --proxy-type http --proxy 127.0.0.1:10801 xxx.xxx 22 3For Windows needed to use ssh.exe. At least for the moment.
Host device2 ProxyCommand ssh.exe -q device1 nc -q0 localhost xxxxx