Копіювання захищених файлів між серверами в один рядок?


13

Я хотів би скопіювати squid.confз одного сервера на інший.

  • Сервери не розмовляють між собою. Я хотів би пройти свою робочу станцію.
  • На обох серверах є файл, тому він буде перезаписаний у ціль.
  • Файли мають 600дозвіл і належать root.
  • root вхід через ssh відключений ( PermitRootLogin no).
  • Я хотів би зробити це в одному рядку, якщо це можливо, оскільки це буде частиною посібника з налаштування.

Я знаю, що робити

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

копіювати файли між серверами та зберігати дозволи. Однак у цьому випадку я отримаю "Дозвіл відмовлено".

Я також знаю, що можу це зробити:

ssh -t source 'sudo cat /etc/squid/squid.conf'

Таким чином, -tsudo дозволяє запитувати пароль адміністратора, перш ніж виводити вміст файлу.

Проблема полягає в тому, що я не знаю, як поєднати ці методи в те, що попросить пароль sudo на кожному сервері та перенести файл за призначенням. Чи можливо це?

ОНОВЛЕННЯ : Ось найкраще, що я міг придумати:

ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
    ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
    'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'

Називати це одноколісним здається розтягуванням. Думаю, я просто розбию його на окремі кроки в посібнику з налаштування.


Відповіді:


11

Простіше ланцюг ssh з ssh, ніж ланцюжок ssh з sudo. Тож зміна конфігурації сервера ssh нормальна, я пропоную відкрити ssh для кореня кожного сервера, але тільки з localhost. Це можна зробити за допомогою Matchпункту sshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Потім ви можете налаштувати ланцюжок автентифікації на основі ключа від віддаленого користувача до локального користувача та від локального користувача до root. У вас ще є стежка аутентифікації, тому ваші журнали повідомляють, хто ввійшов у систему як root, а кроки аутентифікації такі ж, як якщо б було залучено sudo.

Щоб підключитися до сервера як root, визначте псевдонім ~/.ssh/configтаким чином:

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

Якщо ви наполягаєте на використанні sudo, я вважаю, що вам знадобляться окремі команди, як і sudoнаполягаєте на читанні з терміналу (навіть якщо у нього є квиток на ваш рахунок) ¹, і жоден із звичайних методів копіювання файлів (scp, sftp, rsync) підтримка взаємодії з віддаленим терміналом.

Дотримуючись ssh та sudo, запропоновані команди можуть бути спрощені. З кожної сторони, якщо у вас налаштовано sudo більше не запитувати пароль, ви можете запустити його один раз, щоб перейти з вимогою пароля і в інший раз скопіювати файл. (Ви не можете легко скопіювати файл безпосередньо, оскільки запит на введення пароля стає на шляху.)

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹ якщо у вас немає NOPASSWD, але тоді ви б цього не запитували.


Перше рішення працювало для мене добре, але другий слід Match host localhost.
cduck

4

Ви можете налаштувати sudoне запитувати пароль наступним чином:

У джерелі:

user    ALL=NOPASSWD:/bin/cat

Ціль:

user    ALL=NOPASSWD:/usr/bin/tee

І робіть на юр машині:

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

Але я рекомендую використовувати щось на зразок лялечки . Це набагато краще і простіше вирішує вашу проблему з розподілом файлів конфігурацій.

PS. До речі, якщо ви налаштуєте sudoзапитувати пароль у користувача, рядок з [sudo] password for userфайлом з'явиться в цільовому файлі.


+1 за те, що ви запропонували лялечку, але ваше рішення видається небезпечним. Я можу також дозволити вхід у систему як root.
itadok

2

Замість використання ssh ви можете використовувати scp для передачі файлу між серверами.

Увійдіть на цільовий сервер:

Перейдіть до цільового режиму, куди потрібно скопіювати файл.

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r - рекурсивний p - зберігає час модифікації, час доступу та режими з вихідного файлу


Це передбачає, що я можу ввійти як корінь, а я не можу. Оновлення питання.
itadok

2

Не змінюючи конфігурацію ssh, ви можете створити два ssh-тунелі host-> server1 та server2-> хост через ssh-з'єднання до server2. Підключіть ці два тунелі на хост-машині (той же порт). І запустіть sudo на сервері2, щоб отримати дані з підключених тунелів на сервері1 та зберегти їх на сервері2.

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

Ідея така: 1 - створити локальний тунель від машини до вихідної машини на порту 60000

ssh -L60000:${source}:22

1b - Створіть віддалений тунель, щоб повернутися до машини

-R60000:localhost:60000

2- підключення до цільової машини

-t ${target}

3- запустити все як root на цільовій машині для запису

'sudo bash -c "..."'

4- підключіться до вихідної машини через тунель. whoami та on localhost, що означає localhost на машині $ {target}.

ssh -p 60000 '$(whoami)'@localhost

5- упакуйте віддалені файли (файли) та надішліть їх на блискавці до stdout

cd /path/to/dir; tar -czf - file

6- отримайте пакет через stdout та витягніть файли відповідно в каталог / path / to / target

|tar -C/path/to/target -xzf -

Примітка. Ви можете отримати до 3 підтверджень sshkey та 3 запитів пароля. Але файли будуть скопійовані.

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