Estou trabalhando em um aplicativo da Web LAMP e há um processo agendado em algum lugar que continua criando uma pasta chamada shop
na raiz do site. Toda vez que isso aparece, causa conflitos com regras de reescrita no aplicativo, nada bom.
Até encontrar o script incorreto, existe uma maneira de impedir que qualquer pasta chamada shop
seja criada na raiz? Sei que posso alterar as permissões em uma pasta para impedir que seu conteúdo seja alterado, mas não encontrei uma maneira de impedir que uma pasta com um determinado nome seja criada.
linux
directory
directory-structure
Andrew
fonte
fonte
Respostas:
Você não pode, dado que o usuário que cria o diretório tem permissão suficiente para gravar no diretório pai.
Em vez disso, você pode alavancar a
inotify
família de chamadas do sistema fornecidas pelo kernel Linux, para observar a criação (e opcionalmentemv
-ing) do diretórioshop
no diretório especificado, se criado (ou opcionalmentemv
)rm
o diretório.O programa userspace necessário neste caso é
inotifywait
(vem cominotify-tools
, instale-o primeiro, se necessário).Supondo que o diretório
shop
residisse no/foo/bar
diretório, vamos definir um monitoramento para a/foo/bar/shop
criação e,rm
instantaneamente, se criado:inotifywait -qme create /foo/bar
observa o/foo/bar
diretório de qualquer arquivo / diretório que possa ser criado, ou seja, observe qualquercreate
eventoSe criado,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
verifica se o arquivo é um diretório e se o nome éshop
(/,ISDIR shop$/
); se for,rm
o diretório (system("rm -r -- /foo/bar/shop")
)Você precisa executar o comando como um usuário que tenha permissão de gravação no diretório
/foo/bar
para remoção doshop
diretório.Se você deseja monitorar
mv
também as operações de gravação, adicione watch formoved_to
event também:Apenas para observar, se você estiver procurando por um arquivo, não um diretório, chamado
shop
:fonte
inotifywait
para fazer isso também é possível que o gatilho pode também ser capaz de capturar o processo comps -ef
Responder literalmente com base na questão de impedir que uma pasta com um determinado nome seja criada.
touch shop
Você não pode criar um diretório se um arquivo com um nome idêntico existir
mkdir: cannot create directory ‘shop’: File exists
fonte
chattr +i shop
para torná-lo imutável. Até que o sinalizador imutável seja removido, ele não pode nem ser renomeado / excluído.rename(2)
ainda funcionar, já que o nome não faz parte do inode, mas não funciona. Pesquisa rápida na Internet não revela o porquê. Alguma dica?rename
funcione.Que tal seqüestrar
mkdir
syscall comLD_PRELOAD
...?Observe que dentro deste manipulador você pode registrar o PID do processo que deseja criar este diretório:
Você precisa colocá-lo no
~/.bashrc
root (ou em quem estiver executando seu aplicativo) para garantir que isso seja usado:fonte
LD_PRELOAD
hacks como esse estão sempre sempre errados e, a menos que você saiba o que está fazendo, eles podem prejudicar o programa em que são carregados, quebrando propriedades como a segurança de sinal assíncrono da função que você está substituindo.fopen
deve ter"a"
, em vez de"w"
, por isso pode preservar registros anterior(Teria comentado a resposta de Miati, mas não me lembro da minha conta antiga e não tenho reputação suficiente nessa nova ...)
Você pode bloquear a criação criando um arquivo e alterando os atributos do arquivo.
Qualquer tentativa de fazer qualquer coisa com esse arquivo será bloqueada - mesmo que o usuário se torne root.
fonte
Crie um link simbólico apontando para um local inexistente dentro de um diretório inexistente. Isso tem algumas implicações divertidas:
EEXIST
(o arquivo existe).ENOENT
(Nenhum arquivo ou diretório desse tipo)ENOENT
. É claro que o lstat retornará as informações sobre o link simbólico.Isso tem duas vantagens sobre algumas das outras soluções propostas aqui: (a) você não precisa de um serviço em execução que rastreie a criação do diretório e (b) o nome parece não existir para a maioria dos comandos.
Você terá que tentar, mas suspeito que, independentemente das regras de reescrita que você possui, elas não usam lstat ou outros comandos que não fazem referência à referência, fazendo com que falhem.
fonte