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 a file on server A (which is behind a NAT so not directly addressable). The file needs to be copied to server B in a directory restricted to root. I have an account on server B with sudo privileges. What is the syntax for the scp command?

share|improve this question
    
    
i've closed the older question as a duplicate of this one, since the question asker never regained ownership of that question. –  quack quixote May 8 '10 at 0:51

6 Answers 6

up vote 26 down vote accepted

First, you need to copy the file to a place where you have write access without sudo,

scp yourfile serverb:

Then move the file using sudo

ssh serverb sudo mv yourfile /path/to/the/destination

If you do not have a writable place, make a temporary dir with write permission for your user.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination
share|improve this answer
4  
/tmp is a good place for writing temporary files that (usually) all users have access to. –  Doug Harris May 7 '10 at 23:28
2  
@Doug: Note that /tmp could be in RAM or in / mounting point, and not necessarily large enough to host big files. –  Ravachol Dec 12 '11 at 16:38
    
Whatever you are trying to accomplish, chmod 777 is usually the wrong way to do it. Consider what could happen if somebody else was logged in and knew you were about to run this code. –  tripleee Jul 23 at 13:39

You can use ssh and tar to work around this:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

This first updates your sudo timestamp (asking for a password if necessary, which requires a tty (ssh -t)), and then uses sudo to create a tarball remotely and extract it locally.

"tar" on RedHat 5 requires the "--preserve" options to come after the "xpsf -" command.

share|improve this answer
    
Just a note: if you get tar: Invalid replacement string, removing -s in the seems to fix it (not sure what you need the s for anyway). Many thanks; this is awesome. –  RecursivelyIronic Feb 15 '13 at 21:55

With SCP, you have to do in two steps, however, you can do it in one with rsync as follows:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

Edit: This does require NOPASSWD sudo. If you have to enter the password for sudo, then the two step way is needed.

share|improve this answer
    
This is by far the simplest way to do it. –  Matt White Jul 23 at 20:55

I've written a short program for this. You will need python 2.7 and fabric.

https://github.com/jeidsath/sudoscp

share|improve this answer

You can use sftp with sudo command, for instance:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST
share|improve this answer
ssh user@serverB

user@serverB: sudo scp user@remote:/path/file   /path/tofileonB
share|improve this answer

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.