Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I have access to 3 machines, A, B, and C. The only possible (ssh) connections are:

A -> B
B <-> C

I need to get files from A to C, so I could scp the files from A to B, and then scp them from B to C. However, B doesn't have much disk space, so this is not an option. Is there a way to scp files from A to C via B? Note, I don't have root access on any of the machines, so don't think I can set up any persistent tunnels, but correct me if I'm wrong!

share|improve this question
    
I know this doesn't answer the question, but for those who don't know about rsync, or don't know how to use it to hop through a host, this could be a useful tip: use the '-e' option with rsync like this: A$ rsync <options> -e 'ssh B ssh' source C:destination –  Eddified Apr 1 at 21:44
add comment

3 Answers

up vote 11 down vote accepted

Pipes:

A$ tar c thefile anotherfile | ssh B "ssh C \"cd destination && tar xv\""

(Sometimes tar cf - or tar cf /dev/stdout has to be used instead of tar c. Similar for the receiving end.)

single-file:

A$ cat < thefile | ssh B "ssh C \"cd destination && cat > thefile\""

Tunnel through B:

A$ ssh -fN -L 4567:C:22 B
(all TCP connections to localhost:4567 now are forwarded through B to C:22)
A$ scp -P 4567 thefile localhost:destination

When you're done, don't forget to kill the previously started ssh process (which has dropped to background due to -fN).


ProxyCommand, assuming either socat or nc is installed on B:

A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination

or

A$ scp -oProxyCommand="ssh B nc -v %h %p" thefile C:destination

Reverse tunnel through B to A; doesn't always work

A$ ssh -fN -R 4567:localhost:22 B

(now you can reach A from B, by using localhost:4567)

B$ scp -P 4567 localhost:thefile C:destination
share|improve this answer
1  
Thanks! I used the second option without any issues :) –  astrofrog May 10 '11 at 16:43
add comment
ssh -L 4321:hostC:22 youruser@hostB

in another shell:

scp -P 4321 localfile [email protected]

This is using port forwarding. The only limitation here is host B needs to be configured to allow port forwarding. Otherwise this should work fine.

In the way of explanation, -L and -R allow you to forward ports. In -L, the first port given is the port ssh will begin listening on the originating machine (host A), and it'll forward anything it receives on that port over your SSH connection to host B, then route to host C on port 22.

edit

I messed up the syntax slightly. It sets up a forward on your LOCAL machine.

share|improve this answer
    
@astrofrog - if one of our answers satisfies your needs, you should probably accept one of them. –  Brian Vandenberg May 2 '11 at 22:28
add comment

Versions of scp from early 2011 and later may have a "-3" option:

 -3      Copies between two remote hosts are transferred through the local
         host.  Without this option the data is copied directly between
         the two remote hosts.  Note that this option disables the
         progress meter.

If you have this you can just run:

B$ scp -3 A:file C:file
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.