17

I'm trying to set up automatic SSH hopping through a server which doesn't have nc.

This works from the command line:

ssh -A gateway ssh steve@target

(I have added my public key to the SSH agent).

However, adding it to ~/.ssh/config doesn't:

Host target
  User steveb
  ProxyCommand ssh -A gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

Attempting to force the issue with -t is amusing but unhelpful.

ProxyCommand ssh -A -t gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

More -t's? No good.

ProxyCommand ssh -A -t -t gateway ssh steve@targetip

$ ssh target
tcgetattr: Inappropriate ioctl for device


^CKilled by signal 2.

Is this possible? Most tutorials (eg http://www.arrfab.net/blog/?p=246 ) suggest using nc.

3
  • Is the conclusion that netcat is required?
    – MountainX
    Jul 9, 2013 at 4:24
  • Looks like it. In this instance, I was able to get it installed, solving my problem - but I don't always have that luxury. Jul 9, 2013 at 6:28
  • See my answer below for two ways I was able to do this without netcat.
    – MountainX
    Jul 27, 2013 at 3:52

4 Answers 4

14

SSH ProxyCommand without netcat

The ProxyCommand is very useful when hosts are only indirectly accessible. With netcat it is relative strait forward:

ProxyCommand ssh {gw} netcat -w 1 {host} 22

Here {gw }and {host} are placeholders for the gateway and the host.

But it is also possible when netcat is not installed on the gateway:

ProxyCommand ssh {gw} 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'

The /dev/tcp is a built-in feature of standard bash. The files don't exist. To check whether bash has this feature built-in use run:

cat < /dev/tcp/google.com/80 

...on the gateway.

To make sure that bash is used, use:

ProxyCommand ssh {gw} "/bin/bash -c 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'"

And it even works together with ControlMaster.

(Updated on Oct 22 to include kill to clean up background cat) (Updated on Mar 3 2011 to make placeholders more clear and explain /dev/tcp)

100% credit to roland schulz. Here's the source:
http://www.rschulz.eu/2008/09/ssh-proxycommand-without-netcat.html
see more useful info in the comments there.

There is also more here:
http://www.linuxjournal.com/content/tech-tip-tcpip-access-using-bash
http://securityreliks.securegossip.com/2010/08/enabling-devtcp-on-backtrack-4r1ubuntu/

UPDATE: here's something new from Marco

In reference to a ProxyCommand in ~/.ssh/config where one has a line like this:

ProxyCommand ssh gateway nc localhost %p

Marco says:

You don't need netcat if you use a recent version of OpenSSH. You can replace nc localhost %p with -W localhost:%p.

The result would look like this:

ProxyCommand ssh gateway -W localhost:%p
0
9

Big T, not little t.

-T' Disable pseudo-tty allocation.
-t' Force pseudo-tty allocation. 

My script used to return that message, and does no longer.

/usr/bin/ssh -T -q -i $HOME/.ssh/one_command other_system

I use the authorized_key on the other_system to cause this to run a command:

from="my.mydomain.com",command="bin/remotely-run" ssh-rsa ... 
3

Give this a try:

ProxyCommand ssh -A -t gateway ssh -t steve@targetip
5
  • Wait, how's that different from what I've tried? Jul 8, 2013 at 4:26
  • @SteveBennett The difference is that this does not only try to allocate a TTY on the second system but on the first, too. Jul 8, 2013 at 4:33
  • it's exactly the same command I mentioned with the "amusing but unhelpful" result? Jul 8, 2013 at 6:24
  • @SteveBennett I misread that, indeed. My aim was to have the -t in both connections and I saw it in the wrong one. I have edited my answer. Jul 8, 2013 at 6:48
  • Ah. Well, still no good. Tried all the combinations. Jul 8, 2013 at 7:41
-3

You could try the following technique of ssh'ing into server1 followed by ssh'ing into server2.

$ ssh -t user1@server1 ssh -t user2@server2 

Doing it like this works for me.

1
  • 1
    Please explain more... What this command does and how it is useful to solve the answer.
    – TPS
    Sep 10, 2014 at 12:00

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .