55

У меня есть файл на сервере A (который находится за NAT, поэтому не имеет прямой адресации). Файл необходимо скопировать на сервер B в каталог, ограниченный root. У меня есть учетная запись на сервере B с привилегиями sudo. Каков синтаксис команды scp?

6 ответов6

50

Во-первых, вам нужно скопировать файл в место, где у вас есть доступ для записи без 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
38

С 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
18

Вы можете использовать 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 -».

4

Вы можете использовать sftp с командой sudo, например:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST
0

Если вам нужно каждый раз вводить пароль для 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.

-1
current server $ sudo scp username@server:source/path/filename /tmp/

Он скопирует определенный файл из источника в /tmp / на текущем сервере

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .