Сохранение разрешений с SCP

Вопрос или проблема

SCP, похоже, не сохраняет отметки собственности, даже если используется с опцией -p.

scp -p /mysql/serv/data_summary.* some_server:/mysql/test/

Файлы принадлежат mysql, и я хочу, чтобы та же собственность назначалась на сервере назначения. Мне нужно копировать файлы как root на обоих серверах из-за некоторых административных проблем. Я не могу переключиться на mysql@

Попробуйте использовать rsync, у него гораздо больше преимуществ, кроме сохранения собственности, прав доступа и инкрементных копий:

rsync -av source 192.0.2.1:/dest/ination

Кроме того, поскольку rsync использует ssh, он должен работать там, где работает scp.

Это верно. “-p” этого не делает. См. страницу man:

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

Обратите внимание, что там указаны время и режимы, НО не собственность пользователя/группы. У вас будет больше успеха с “rsync”, так как у него есть различные возможности по сохранению прав доступа при копировании между разными системами. Например, “-p” в rsync.

scp этого не позволяет. rsync был предложен ранее, но если он недоступен (например, не установлен по умолчанию на Windows GitHub runner), вы можете использовать команду chown, чтобы достичь своей цели. Вот как я это делаю в своей CI/CD:

- name: Изменить собственность папки
  run: |
    ssh ${{ vars.REMOTE_USER }}@${{ vars.REMOTE_HOST }} "chown -R ${{ vars.REMOTE_USER }}:www-data ${{ vars.PUBLISH_TARGET }}"
  continue-on-error: true

Убедитесь, что пользователь принадлежит нужной группе; в противном случае вам нужно будет добавить здесь права sudo.

Ответ или решение

Чтобы сохранить права доступа и владельца файлов при копировании между серверами, вы можете использовать команду rsync, которая предлагает больше возможностей, чем scp. Как вы заметили, опция -p в scp сохраняет только метки времени и режимы файла, но не владельца и группу. rsync позволяет сохранить все эти атрибуты с помощью опции -a, которая включает в себя сохранение владельца и группы, если вы запускаете команду с правами суперпользователя (root).

Вот пример команды с использованием rsync:

rsync -avz /mysql/serv/data_summary.* root@some_server:/mysql/test/

Здесь:

  • -a — это архивный режим, который сохраняет все атрибуты файлов, включая права доступа, владельца и группу.
  • -v — выполняет вывод в режиме подробной информации о процессе копирования.
  • -z — сжимает данные во время передачи (опционально, но может ускорить передачу для больших файлов).

Если по какой-то причине rsync недоступен (например, не установлен на вашем сервере), вы можете сделать следующее после копирования файлов с помощью scp:

  1. Сначала выполните копирование с помощью scp:

    scp /mysql/serv/data_summary.* root@some_server:/mysql/test/
  2. Затем используйте команду chown, чтобы изменить владельца и группу на целевом сервере:

    ssh root@some_server "chown -R mysql:mysql /mysql/test/"

Важно помнить, что для выполнения команды chown у вас должны быть соответствующие права на целевом сервере. Если пользователь, под которым вы выполняете команду, не имеет необходимых привилегий, вам может понадобиться использовать sudo:

ssh root@some_server "sudo chown -R mysql:mysql /mysql/test/"

Таким образом, в случае использования scp вы сможете установить нужные права после копирования при помощи chown. Тем не менее, рекомендуется использовать rsync, если это возможно, поскольку он упрощает процесс и минимизирует количество шагов.

Оцените материал
Добавить комментарий

Капча загружается...