Script de shell de um usuário para copiar um arquivo no diretório pertencente a um usuário diferente [duplicado]

0

Eu 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 as 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?

    
por Vicky 27.04.2017 / 05:20

4 respostas

1

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

Isto supõe que você quer que ambos os usuários tenham acesso ao diretório. Se você quiser que o usuário 1 tenha acesso, apenas altere as permissões da seguinte forma:

chown user1.user1 /myDirectory
    
por 27.04.2017 / 05:35
0

As group permissões para mydirectory estão chegando na sua maneira de remover ou criar um arquivo nesse diretório.

como user1 execute o seguinte comando primeiro:

chmod g+w mydirectory
    
por 27.04.2017 / 05:28
0

Seria melhor se o usuário que precisa fazer a escrita, ou seja, o usuário que você está copiando para , executar 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 ]

está com defeito. O teste -f recebe um argumento, mas se o padrão corresponder a vários arquivos, você passará vários argumentos. Como você deseja esvaziar o diretório myDirectory de compactados tar archives, é suficiente

rm -f /myDirectory/*.tar.gz

O sinal -f to rm fará com que ele não cometa erros se não houver arquivos para excluir.

    
por 27.04.2017 / 09:15
-1

Bem, vejo muitos erros:

  1. Você não tem permissão para escrever em myDirectory . Somente user2 tem permissão para escrever lá.
  2. Você está misturando absoluto com caminhos relativos. /myDirectory é um diretório diferente de myDirectory . Isso também pode causar o erro de permissão negada, porque seu script está tentando copiá-lo na pasta raiz do sistema de arquivos myDirectory . Se myDirectory for relativo ao caminho do caminho da linha de comando atual (em que contexto o script é chamado), ./myDirectory estaria correto. Caso contrário, considere nos fornecer informações mais detalhadas em que myDirectory está realmente localizado em. Isso é importante, porque o escopo do caminho relativo para myDirectory pode diferir de várias maneiras. Sem conhecer 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.
  3. A expressão de condição [ e ] está disponível apenas em Bash , não em Shell . A definição de Shell depende também do seu sistema UNIX atual em funcionamento. Normalmente, no Linux, ele aponta para o Bash , porque o Linux não tem implementação direta de Shell , nem o BSD o possui. Apenas o Mac tem sua própria implementação direta de Shell . Portanto, Shell é apenas um padrão teórico do UNIX, que acaba hoje em muitos dialetos e interpretações diferentes daquele documento teórico, que realmente depende do seu sistema UNIX atual em execução. Portanto, use melhor diretamente Bash . Isso funciona 100% na maioria das plataformas UNIX. Eu não conheço nenhum sistema UNIX, no qual o Bash não está disponível.

Alguns outros pontos interessantes para pensar: Você pode querer adicionar vários grupos, que são user1 e user2 . Em seguida, você pode alterar o grupo de pastas principais de myDirectory para esse grupo. Isso é tanto quanto eu sei a abordagem comum para isso.

Você também pode usar o Bash por meio do comando /usr/bin/env shebang, o que garante que você realmente acabará em qualquer Bash:

#!/usr/bin/env bash

Esta é também uma boa abordagem para outras linguagens de script como perl, php, etc.

    
por 27.04.2017 / 09:43