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?
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
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
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.
If you need to type password for sudo every-time, you can save it to a file:
echo "Enter password: "; read -s password; echo $password > password_file
and then send it along with the source file.
cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'
You can use
tee instead of
sponge if you don’t have moreutils.
First, you need to copy the file to a place where you have write access without sudo, You can do the following two steps.
scp filename newserver
ssh newserver sudo mv filename /path/to/the/destination
for more information read scp tutorial