Копирование защищенных файлов между серверами в одну строку?

13

Я хотел бы скопировать squid.confс одного сервера на другой.

  • Серверы не общаются друг с другом. Я хотел бы пройти через мою рабочую станцию.
  • Файл есть на обоих серверах, поэтому он будет перезаписан на цели.
  • Файлы имеют 600разрешение и принадлежат пользователю 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'

Назвать это одной строкой кажется натяжкой. Я думаю, что я просто разбью его на отдельные шаги в руководстве по установке.

itsadok
источник

Ответы:

11

Проще связать ssh с ssh, чем ssh с sudo. Так что изменение конфигурации сервера ssh - это нормально, я предлагаю открыть ssh для root каждого сервера, но только с локального хоста. Вы можете сделать это с помощью 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 - сохраняет время модификации, время доступа и режимы из исходного файла

Mughil
источник
Это предполагает, что я могу войти в систему как root, что я не могу. Обновление вопроса.
itadok
2

Не изменяя конфигурацию ssh, вы можете создать два туннеля ssh host-> server1 и server2-> host через соединение ssh с server2. Соедините эти два туннеля на главном компьютере (тот же порт). И запустите sudo на сервере server2, чтобы получить данные из подключенных туннелей на сервере server1 и сохранить их на сервере server2.

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 и на localhost означают localhost на машине $ {target}.

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

5- упакуйте удаленный файл (ы) и отправьте его в stdout в сжатом виде

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

6 - получить пакет через стандартный вывод и распаковать файлы соответственно в каталог / path / to / target

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

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

Марко Аурелио
источник