Вопрос или проблема
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
:
-
Сначала выполните копирование с помощью
scp
:scp /mysql/serv/data_summary.* root@some_server:/mysql/test/
-
Затем используйте команду
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
, если это возможно, поскольку он упрощает процесс и минимизирует количество шагов.