scp to remote server with sudo
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?
Solution 1:
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
Solution 2:
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
Note: This does require NOPASSWD
sudo configuration. If you have to enter the password for sudo, then the two step way is needed.
To copy directory, you need to add -r
parameter. And -v
for verbose output.
To use above method with credentials, you need to add them into your ~/.ssh/config
file, e.g.
Host SERVER2
HostName server2.example.colm
User USER
#IdentityFile ~/.ssh/custom_key.pem
Solution 3:
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.