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

65

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

Нил
источник
Аналогичный вопрос: superuser.com/questions/87597/how-to-perform-scp-as-a-sudo-user
Кевин Панко
я закрыл старый вопрос как дубликат этого, так как вопросник никогда не возвращал право собственности на этот вопрос.
шарлатан-кихот
Я ответил на другой пост, как вы можете настроить 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
Johan
источник
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
MasterCheffinator
источник
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 -».

blueyed
источник
Просто примечание: если вы получаете 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
DaniloNC
источник
Этот метод и метод 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