scp на віддалений сервер з sudo


65

У мене є файл на сервері A (який знаходиться за NAT, тому він не може бути адресований безпосередньо). Файл потрібно скопіювати на сервер B у каталозі, обмеженому коренем. У мене є обліковий запис на сервері B з правами sudo. Що таке синтаксис команди scp?



Я закрив старе питання як дублікат цього, оскільки запитувач ніколи не повернув право власності на це питання.
крякав кіхот

Я відповів на іншій публікації про те, як ви можете налаштувати scp робити судо безпосередньо для вас. Це схоже на те, що робить WinSCP.
YoYo

Відповіді:


58

По-перше, вам потрібно скопіювати файл у те місце, де у вас є доступ для запису без судового коду,

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 може бути в оперативній пам'яті або в / монтажному пункті, і не обов'язково достатньо великий для розміщення великих файлів.
Равачол

2
Що б ви не намагалися зробити, chmod 777зазвичай це неправильний спосіб зробити це. Поміркуйте, що може статися, якщо хтось інший увійшов у систему та знав, що ви збираєтеся запустити цей код.
tripleee

1
ssh sudoне працює для мене - скаржиться на те, що "не вказано tty присутності та не вказано жодної програми запиту"?
Росс Прессер

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 вимагає, щоб після "xpsf -" були параметри "--preserve".


Лише зауваження: якщо ви отримаєте tar: Invalid replacement string, видалення, -sздається, виправить це (не впевнений, що вам потрібно sдля будь-якого). Дуже дякую; Це круто.
РекурсивноІронічний

Це вимагатиме tty_ticketsвідключення, правда?
Яків Будін

@JacobBudin так.
синюватий

4

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

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

Це та методи rsync - це, мабуть, найбільш прямий спосіб зробити це за один крок. Прикро, що завдання scp у мурашника не підтримує його. Ви можете встановити його для використання 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якщо у вас немає додаткових утиліт.


0

По-перше, вам потрібно скопіювати файл у місце, де у вас є доступ для запису без судового режиму. Ви можете зробити наступні два кроки.

Крок 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 / на поточний сервер


Він виконуватиме судо локально, не даючи вам підвищених привілеїв віддалено.
YoYo

Це, як каже @Yoyo, просто не спрацює.
Мані

scp, ймовірно, не підключиться, тому що він прочитає ключ root
П'єр-Олів'є Варес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.