Назад | Перейти на главную страницу

Заставить SFTP / SCP копировать файлы с разрешения удаленного каталога

У меня проблема с SFTP и SCP, когда файлы, которые копируются, не наследуют разрешения удаленного родительского каталога. Я видел похожие вопросы о serverfault, где umask сеанса SFTP / SCP изменяется, однако это не обязательно решает мою проблему, так как некоторые каталоги должны иметь другие разрешения, чем другие. Таким образом, у меня нет значения по умолчанию umask устанавливать.

Таким образом, я хочу сила скопированный файл должен иметь разрешения, установленные родительским каталогом в удаленной системе. По сути, я хочу, чтобы SCP / SFTP работал так же, как cp работает без в -p вариант. В настоящее время SFTP / SCP имитирует cp -p поведение.

Вот чего я хочу:

1.) Пользователь хочет скопировать файл foo.txt с разрешениями:

-rw-------. 1 user user        0 Feb 29 09:08 foo.txt

2.) Пользователь использует SCP для копирования foo.txt на сервер в каталоге /bar. /bar имеет разрешения (установлен setgid):

drwxrws---+  3 root usergroup  4096 Feb 28 12:19 bar

3.) /bar имеет следующий набор фактов:

user::rwx
group::rwx
group:usergroup:rwx
default:user::rwx
default:group::rwx
default:group:usergroup:rw-

4.) foo.txt должен иметь следующие разрешения (и факультативные):

-rw-rw----+ 1 user usergroup     0 Feb 29 09:33 foo.txt
user::rw-
group::rwx     #effective: rw-
group:usergroup:rw-

5.) Вместо этого foo.txt имеет разрешения:

-rw-------+ 1 user usergroup     0 Feb 29 09:36 foo.txt
user::rw-
group::rwx          #effective:---
group:usergroup:rw-     #effective:---

Есть ли простой способ получить для файла ожидаемые разрешения, указанные выше?

Кроме того, имеет ли смысл мои факсы или они излишни?

РЕДАКТИРОВАТЬ: Исправлен пост для правильного отображения. (Код Serverfault и нумерация работают не очень хорошо. Мне нужно было обернуть вещи в предварительные теги.)

На странице руководства: «Когда scp копирует файлы, конечные файлы создаются с определенными атрибутами файлов. По умолчанию права доступа к файлам соответствуют umask на целевом хосте, а время модификации и последнего доступа будет временем копирования. . В качестве альтернативы вы можете указать scp дублировать разрешения и временные метки исходных файлов. Для этого используется опция -p. "

Например:

sftp user@server:backup <<< $'put -rp mysoftware/mysqldump'

Основываясь на приведенной выше информации, я не уверен, что то, что вы хотите, возможно без использования cronjob для установки разрешений. Параметр umask применяется только к создаваемым файлам. Setgid применяется только к группе. Я уверен, что вы можете написать задание, которое устанавливает разрешения рекурсивно, но это все, о чем я могу думать, что приведет к тому, что вы описали, если я не правильно понял вопрос.

Если у вас есть возможность использовать rsync, у вас могут быть дополнительные элементы управления разрешениями. В частности, обратите внимание на текст под --perms вариант. Так говорилось на странице руководства:

      In summary: to give destination files (both  old  and  new)  the
      source permissions, use --perms.  To give new files the destina-
      tion-default   permissions   (while   leaving   existing   files
      unchanged),  make  sure  that  the --perms option is off and use
      --chmod=ugo=rwX (which ensures  that  all  non-masked  bits  get
      enabled).  If you'd care to make this latter behaviour easier to
      type, you could define a popt alias for it, such as putting this
      line  in  the file ~/.popt (the following defines the -Z option,
      and includes --no-g to use the default group of the  destination
      dir):

         rsync alias -Z --no-p --no-g --chmod=ugo=rwX

      You  could  then  use  this new option in a command such as this
      one:

         rsync -avZ src/ dest/

Передайте команду cat через ssh. Это создаст файл (чтобы он унаследовал разрешения), а затем он заполнит его содержимым. Например, чтобы поместить локальный файл foo на remoteHost и унаследовать разрешения, установленные setfacl:

ssh user@remoteHost "/bin/cat > /pathOnRemoteServer/foo" < foo