
Tenho dois usuários e grupos no Unix: user1:user1
e user2:user2
.
Eu tenho um diretório myDirectory
com os detalhes abaixo ( ls -ltr
)
drwxr-xr-x. 4 user2 user2 35 Apr 27 10:16 myDirectory
Agora, estou executando um script myScript.sh
como user1
:
#!/bin/sh
whoami
if [ -f /myDirectory/*.tar.gz ]
then
rm -f /myDirectory/*.tar.gz
fi
cp -f someDirectory/*.tar.gz /myDirectory/
No entanto, recebo o seguinte erro:
cp: cannot create regular file ‘/myDirectory/myTar.tar.gz’: Permission denied
O que estou fazendo de errado? Como posso consertar isso?
Responder1
Você pode fazer isso com permissões de grupo. Você precisa criar um grupo de usuários, adicionar os dois usuários e alterar a propriedade do grupo do diretório de destino. Primeiro, crie um grupo:
groupadd newusergroup
Em seguida, adicione os usuários a ele:
usermod -G newusergroup user1
usermod -G newusergroup user2
Em seguida, altere as permissões no diretório de destino:
chgrp newusergroup /myDirectory
Tudo isso assumindo que você deseja que ambos os usuários tenham acesso ao diretório. Se você deseja que apenas o usuário1 tenha acesso, basta alterar as permissões assim:
chown user1.user1 /myDirectory
Responder2
As group
permissões mydirectory
estão atrapalhando a remoção ou criação de um arquivo nesse diretório.
como user1
execute o seguinte comando primeiro:
chmod g+w mydirectory
Responder3
Seria melhor se o usuário que precisa escrever, ou seja, o usuário que você está copiandopara, executei o script. Dessa forma, você não precisaria conceder permissões especiais de gravação no diretório de destino.
Além disso, o teste
if [ -f /myDirectory/*.tar.gz ]
é defeituoso. O -f
teste aceita um argumento, mas se o padrão corresponder a vários arquivos, você passa vários argumentos. Como você deseja esvaziar o diretório myDirectory
de arquivos compactados tar
, basta
rm -f /myDirectory/*.tar.gz
O -f
sinalizador para rm
fará com que não ocorra erro se não houver arquivos para excluir.
Responder4
Bem, vejo muitos erros:
- Você não tem permissão para escrever em
myDirectory
. Sóuser2
é permitido escrever lá. - Você está misturando caminhos absolutos com relativos.
/myDirectory
é um diretório diferente demyDirectory
. Isso também pode causar o erro de permissão negada, porque seu script está tentando copiá-lo na pasta raiz do sistema de arquivosmyDirectory
. SemyDirectory
for relativo ao caminho do caminho da linha de comando atual (em cujo contexto o script é chamado), então./myDirectory
estaria certo. Caso contrário, considere nos fornecer informações mais detalhadas sobre ondemyDirectory
realmente está localizado. Isto é importante porque o escopo do caminho relativomyDirectory
pode diferir de várias maneiras. Sem conhecer o seu caso explícito, uma resposta relacionada a isso seria apenas uma resposta geral, que pode não ser aplicável ao seu caso específico. - A expressão de condição
[
and]
está disponível apenas emBash
, não emShell
. A definição deShell
depende também do seu sistema UNIX em funcionamento atual. Normalmente, no Linux aponta paraBash
, porque o Linux não temShell
implementação direta, nem o BSD tem. Somente o Mac possui sua própriaShell
implementação direta. Portanto,Shell
é apenas um padrão UNIX teórico, que hoje em dia acaba em muitos dialetos e interpretações diferentes desse documento teórico, que realmente depende do seu sistema UNIX em execução no momento. Portanto, use melhor diretamenteBash
. Isso funciona 100% na maioria das plataformas UNIX. Não conheço nenhum sistema UNIX, no qual o Bash não esteja disponível.
Alguns outros pontos interessantes para pensar: Você pode querer adicionar vários grupos, que são user1
e user2
. Então você pode alterar o grupo de pastas principal myDirectory
para esse grupo. Pelo que conheço, essa é a abordagem comum para isso.
Você também pode usar o Bash através do /usr/bin/env
comando shebang, o que garante que você realmente acabe em qualquer Bash:
#!/usr/bin/env bash
Esta também é uma boa abordagem para outras linguagens de script como perl, php, etc.