У меня есть файл на сервере A (который находится за NAT, поэтому не имеет прямой адресации). Файл необходимо скопировать на сервер B в каталог, ограниченный root. У меня есть учетная запись на сервере B с привилегиями sudo. Каков синтаксис команды scp?
6 ответов
Во-первых, вам нужно скопировать файл в место, где у вас есть доступ для записи без sudo,
scp yourfile serverb:
Затем переместите файл с помощью sudo
ssh serverb sudo mv yourfile /path/to/the/destination
Если у вас нет места для записи, создайте временный каталог с разрешением на запись для вашего пользователя.
ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination
С SCP вы должны сделать это в два шага, однако вы можете сделать это в одном с rsync следующим образом:
rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root
Примечание: для этого требуется настройка NOPASSWD
sudo. Если вам нужно ввести пароль для sudo, то необходимо выполнить два шага.
Чтобы скопировать каталог, вам нужно добавить параметр -r
. И -v
для подробного вывода.
Чтобы использовать вышеуказанный метод с учетными данными, вам нужно добавить их в файл ~/.ssh/config
, например
Host SERVER2
HostName server2.example.colm
User USER
#IdentityFile ~/.ssh/custom_key.pem
Вы можете использовать ssh и tar, чтобы обойти это:
ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve
Сначала обновляется ваша временная метка sudo (при необходимости запрашивается пароль, для которого требуется tty (ssh -t
)), а затем используется sudo для удаленного создания архива и его извлечения локально.
"tar" в RedHat 5 требует, чтобы параметры «--preserve» шли после команды «xpsf -».
Вы можете использовать sftp с командой sudo, например:
sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST
Если вам нужно каждый раз вводить пароль для sudo, вы можете сохранить его в файл:
echo "Enter password: "; read -s password; echo $password > password_file
а затем отправьте его вместе с исходным файлом.
cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'
Вы можете использовать tee
вместо sponge
если у вас нет moreutils.
current server $ sudo scp username@server:source/path/filename /tmp/
Он скопирует определенный файл из источника в /tmp / на текущем сервере