Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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
up vote 36 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
/tmp is a good place for writing temporary files that (usually) all users have access to. – Doug Harris May 7 '10 at 23:28
@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 '14 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
This would require tty_tickets to be disabled, correct? – Jacob Budin Mar 31 at 22:04
@JacobBudin yes. – blueyed Apr 2 at 23:58

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 '14 at 20:55
Error sudo: sorry, you must have a tty to run sudo fixed by -e "ssh -tt". – mj41 Feb 3 '15 at 13:26

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
current server $ sudo scp username@server:source/path/filename /tmp/

It will copy specific file from source to /tmp/ in current server

share|improve this answer
ssh user@serverB

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

You must log in to answer this question.

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