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

Sherlock добрался (1), для (2) xargs обычно предпочтительно, поскольку это допускает более разумный синтаксис и меньше вызова оболочки наверху. Знайте -print0 и -0 опции найти и xargs соответственно как пути с пробелами и специальными символами могут засорить работы.

Для одноразового выполнения действительно не должно иметь значения различие, если Вы не chmodding огромное дерево. Если бы Вы делаете это достаточно часто для формализации в сценарий, я использовал бы xargs.

13
29.12.2011, 15:31
4 ответа

Это легче к цепочке ssh с ssh, чем к цепочке ssh с sudo. Так изменение ssh конфигурации сервера в порядке, я предлагаю открыть ssh для корня каждого сервера, но только от localhost. Можно сделать это с a Match пункт в sshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

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

Для соединения с сервером как корень определите псевдоним в ~/.ssh/config как это:

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

Если Вы настаиваете на том, чтобы использовать sudo, Я полагаю, что Вы должны будете разделить команды, как sudo настаивает на том, чтобы читать из терминала (даже если он имеет билет на Вашу учетную запись), v, и ни один из обычных методов копирования файла (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, но затем Вы не спросили бы это.

11
27.01.2020, 19:53
  • 1
    Первое решение работало хорошо на меня, но вторая строка должна быть Match host localhost. –  cduck 29.08.2017, 14:10

Можно настроить sudo не спросить пароль следующий путь:

На источнике:

user    ALL=NOPASSWD:/bin/cat

На цели:

user    ALL=NOPASSWD:/usr/bin/tee

И сделайте на yur машине:

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

Но я рекомендую использовать что-то как марионетка. Это намного лучше, и легче решает Вашу проблему с распределением файлов конфигурации.

PS. Между прочим, если Вы настроите sudo спросить пароль от пользователя, строки с [sudo] password for user появится в конечном файле.

4
27.01.2020, 19:53
  • 1
    +1 для предложения марионетки, но Вашего решения кажется небезопасным. Я мог бы также позволить входить в систему как корень. –  itsadok 29.12.2011, 16:07

Вместо того, чтобы использовать ssh можно использовать scp для передачи файла между серверами.

Войдите в целевой сервер:

Изменитесь на целевой dir, где Вы хотите скопировать файл.

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

r - рекурсивный p - Сохраняет время изменения, времена доступа и режимы из исходного файла

2
27.01.2020, 19:53
  • 1
    , Это предполагает, что я могу войти в систему как корень, который я не могу. Обновление вопроса. –  itsadok 29.12.2011, 15:08

без изменения конфигурации SSH, вы можете создавать два узла SSH Tunnels -> Server1 и Server2-> хост через SSH-соединение с сервером2. Подключите эти два туннеля на хост-машине (тот же порт). И запустите 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 означают локальныйhost на машине $ {Targe}.

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

5- Упакуйте удаленный файл (ы) и отправьте его на Zipped в STDOUT

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

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

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

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

2
27.01.2020, 19:53

Теги

Похожие вопросы