scp на удаленный сервер с sudo


65

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



я закрыл старый вопрос как дубликат этого, так как вопросник никогда не возвращал право собственности на этот вопрос.
шарлатан-кихот

Я ответил на другой пост, как вы можете настроить scp сделать sudo для вас напрямую. Это похоже на то, что делает WinSCP.
YoYo

Ответы:


58

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

7
/ tmp - хорошее место для записи временных файлов, к которым (обычно) имеют доступ все пользователи.
Даг Харрис

3
@Doug: Обратите внимание, что / tmp может находиться в оперативной памяти или в / точке монтирования и не обязательно должен быть достаточно большим для размещения больших файлов.
Ravachol

2
То, что вы пытаетесь достичь, chmod 777обычно является неправильным способом сделать это. Подумайте, что может произойти, если кто-то еще вошел в систему и знал, что вы собираетесь запустить этот код.
tripleee

1
ssh sudoу меня не работает - жалуется "нет tty настоящего и не задана программа askpass"?
Росс Прессер

1
@RossPresser извините за поздний ответ, но вам нужно либо настроить sudo без пароля, serverbлибо вам нужно ssh serverbотдельно, а затем запустить sudo ...после входа в систему.
Йохан

49

С 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

5
Это, безусловно, самый простой способ сделать это.
Мэтт Уайт

Ошибка sudo: sorry, you must have a tty to run sudoисправлена -e "ssh -tt".
mj41

@ mj41 С -e "ssh -tt", я получаю protocol version mismatch -- is your shell clean?. Любые советы о том, как это исправить?
топор.

19

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


Просто примечание: если вы получаете tar: Invalid replacement string, удаление -sв, кажется, это исправить (не уверен, что вам нужно sдля в любом случае). Большое спасибо; это круто.
RecursivelyIronic

Это потребовало tty_ticketsбы быть отключенным, правильно?
Джейкоб Будин

@JacobBudin да.
голубоглазый

4

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

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

Этот метод и метод rsync, вероятно, являются наиболее прямым способом сделать это за один шаг. К сожалению, задача scp в ant не поддерживает ее. Вы можете настроить его на использование sftp, но не можете изменить удаленную подпрограмму. Обратите внимание, что подпрограмма будет отличаться в зависимости от типа сервера (Solaris может отличаться).
YoYo

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.


0

Во-первых, вам нужно скопировать файл в место, где у вас есть доступ для записи без sudo. Вы можете сделать следующие два шага.

Шаг 1: scp filename newserver

Шаг 2: ssh newserver sudo mv filename /path/to/the/destination

для получения дополнительной информации прочитайте учебник scp


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

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


Он будет выполнять sudo локально, не предоставляя вам никаких привилегий удаленно.
YoYo

Это просто не сработает, как говорит @Yoyo.
Мани

scp, вероятно, не подключится, потому что будет читать ключ root
Pierre-Olivier Vares
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.