Script de shell por um usuário para copiar um arquivo em um diretório de propriedade de outro usuário

Script de shell por um usuário para copiar um arquivo em um diretório de propriedade de outro usuário

Tenho dois usuários e grupos no Unix: user1:user1e user2:user2.

Eu tenho um diretório myDirectorycom os detalhes abaixo ( ls -ltr)

drwxr-xr-x.  4 user2 user2   35 Apr 27 10:16 myDirectory

Agora, estou executando um script myScript.shcomo 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 grouppermissões mydirectoryestão atrapalhando a remoção ou criação de um arquivo nesse diretório.

como user1execute 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 -fteste 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 myDirectoryde arquivos compactados tar, basta

rm -f /myDirectory/*.tar.gz

O -fsinalizador para rmfará com que não ocorra erro se não houver arquivos para excluir.

Responder4

Bem, vejo muitos erros:

  1. Você não tem permissão para escrever em myDirectory. Só user2é permitido escrever lá.
  2. Você está misturando caminhos absolutos com 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 myDirectoryfor relativo ao caminho do caminho da linha de comando atual (em cujo contexto o script é chamado), então ./myDirectoryestaria certo. Caso contrário, considere nos fornecer informações mais detalhadas sobre onde myDirectoryrealmente está localizado. Isto é importante porque o escopo do caminho relativo myDirectorypode 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.
  3. A expressão de condição [and ]está disponível apenas em Bash, não em Shell. A definição de Shelldepende também do seu sistema UNIX em funcionamento atual. Normalmente, no Linux aponta para Bash, porque o Linux não tem Shellimplementação direta, nem o BSD tem. Somente o Mac possui sua própria Shellimplementaçã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 diretamente Bash. 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 user1e user2. Então você pode alterar o grupo de pastas principal myDirectorypara esse grupo. Pelo que conheço, essa é a abordagem comum para isso.

Você também pode usar o Bash através do /usr/bin/envcomando 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.

informação relacionada