У меня проблема с 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