Почему мой tar через ssh (команда через author_keys) портит архив?

408
Felix

С бэкапа я хочу вытащить дампы tgz рабочего сервера. Обе машины работают под управлением Ubuntu 16.04.

Поэтому резервный сервер подключается через ssh и определенный ssh ​​к производственному серверу.

~/.ssh/authorized_keysФайл соответствующего пользователя на сервере должен просто позволить одну команду и ставит столько ограничений, насколько это возможно (я надеюсь?):

command="tar -cz --file - --ignore-command-error --ignore-failed-read /dir/ 2>/dev/null | cat",no-agent-forwarding,no-port-forwarding,no-user-rc,no-X11-forwarding ssh-rsa AABLASHKEY comment

где /dir/каталог для резервного копирования, AABLASSHKEYи comment, конечно же, «реальные» значения.

В | catэтом случае требуется, потому что в противном случае tar в этой версии ubuntu («tar (GNU tar) 1.28») не будет говорить с stdout, заданным ssh (PTY). Стдерр должен войти в пустоту ( 2> /dev/null). Редактировать : точка зрения о PTY является заблуждением, см. Ответ @grawity.

На принимающей стороне ( backupсервере) я подхожу так:

ssh -i /path/to/key the-user@production-server > dir.tgz 

Однако полученный файл отличается по размеру от архива, если я создаю его на сервере, и он не является допустимым архивом (например gzip: stdin: invalid compressed data--crc error ... gzip: stdin: invalid compressed data--length error). Разница в размере составляет 22 байта.

Если я разрешаю резервному серверу любую команду на производительном сервере, сняв с authorized_keysнее ограничения, все будет работать нормально. В какой момент я скучаю?

Ограничения

  • Я действительно хочу использовать tar(не Rsync, Rrsync или что-то в этом роде).
  • Соединение должно быть инициировано резервным сервером
  • Рабочий сервер не должен создавать никаких временных файлов

Решение

Как отметил @Grawity в своем ответе (прочитайте его, чтобы устранить некоторые заблуждения), следующая строка ~.ssh/authorized_keysрешает проблему (и работает на Ubuntu 16.04 с данной версией OpenSSH):

command="tar -cz --file - --ignore-command-error --ignore-failed-read /dir/ 2>/dev/null",restrict ssh-rsa .... 

Чтобы команда back-up-server не выдавала предупреждений, подключитесь к:

ssh -o RequestTTY=no -i /path/to/key the-user@production-server > dir.tgz 
1

1 ответ на вопрос

3
grawity

В | catэтом случае требуется, потому что иначе tar […] не будет говорить с stdout, заданным ssh (PTY).

Нет. Наличие PTY - это точно одна из ваших проблем. TTY слой существует для обработки управляющих символов терминала и не то, что вы хотите на все другие виды данных.

Обычно запуск ssh в пакетном режиме (т.е. ssh <host> <cmd>) не выделяет серверную часть PTY; это обеспечит 8-битный чистый канал. Но когда вы не предоставляете команду на клиенте, вам нужно явно добавить опцию -Tили RequestTTYclient, чтобы отключить запрос TTY,

ssh -T theuser @ prod> dir.tgz ssh -o RequestTTY = no theuser @ prod> dir.tgz 

или предоставьте фиктивную команду,

ssh theuser @ prod foo > dir.tgz 

или запретите такие запросы с параметром no-ptyавторизованным ключом:

command = "tar -czf - / dir / 2> / dev / null", no-pty, ограничить ssh-rsa ABCDEF 

( restrictэто недавно добавленный псевдоним, который отключает все переадресации сразу, включая те, которые могут быть добавлены в будущем. Он доступен с OpenSSH 7.2 . На самом деле, он даже включает no-pty, хотя я перечислил его отдельно для этого ответа.)

Потрясающие. Afaiu, опция `no-pty` является более безопасным способом (/ предотвращение / терминальное управление последовательностями?). Felix 6 лет назад 0
Большинство последовательностей управления имеют смысл только для самого терминала, но уровень pty обрабатывает основные вещи редактирования строки, такие как перевод CR ⇄ CRLF (расширение байта с 0A до 0D 0A или наоборот). grawity 6 лет назад 0
Я перечитал ваш комментарий, и да, с точки зрения повреждения данных, безопаснее отключить размещение на стороне сервера на стороне PTY, чем полагаться на то, что клиенты всегда его понимают. (Тем не менее, вы все равно хотите, чтобы клиентская опция избегала назойливого предупреждения.) grawity 6 лет назад 0

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