Existe uma maneira de dizer ao sudo para definir meu nome de usuário como proprietário dos arquivos criados em vez do root?

19

Se eu fizer um sudo cp /etc/foo.txt ~/foo.txt , o novo arquivo será criado com root como proprietário.

Neste momento, não vejo outra maneira senão usar os dois últimos comandos ( ls para esclarecer o caso de uso):

belmin@server1$ ls /etc/foo.txt
>  -rw------- 1 root root 3848 Mar  6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_

Eu preferiria:

  1. Fazendo isso em um comando sudo .
  2. Não ter que especificar meu usuário atual (talvez usando uma variável?).
por Belmin Fernandez 20.08.2014 / 14:58

5 respostas

32

Use install em vez de cp :

sudo install -o belmin /etc/foo.txt ~/foo.txt
    
por 20.08.2014 / 15:08
14

Com um compatível com POSIX cp , você pode sudo cp -p foo bar a preserve os seguintes metadados de arquivo ao copiar:

  • Tempo de acesso
  • Tempo de modificação
  • ID do usuário
  • ID do grupo
  • Modo

Se você quiser definir um diferente usuário a solução da JennyD é melhor.

    
por 20.08.2014 / 15:08
8

Se você fizer isso:

sudo cat /etc/foo.txt > ~/foo.txt

Em seguida, ~/foo.txt será aberto pelo shell como você (criado com suas credenciais) e, em seguida, sudo será executado com o stdout redirecionado para ele.

No final, o arquivo será de sua propriedade.

Esse tipo de abordagem também ajuda a limitar as coisas feitas por root . Aqui, root só usa seu privilégio para abrir /etc/foo.txt , ele não faz o que é potencialmente prejudicial (abra um arquivo para gravação, que poderia ter consequências ruins se ~/foo.txt fosse um symlink por exemplo). / p>     

por 20.08.2014 / 23:10
3

Usando sudo , você alterna para outro usuário. Esse é o ponto principal do comando. Presumo que você não tenha acesso regular ao primeiro arquivo, então você precisa ser outro usuário ( root neste caso) para obter acesso.

Não há como o sudo gerenciar isso, já que tudo o que o sudo está fazendo é mudar você para o outro usuário para executar o comando.

Você precisará

  1. continue usando dois comandos (ou um comando composto)
  2. encontrar outro comando (como instalar, visto em outra resposta)
  3. ou escreva um script e execute esse script por meio de sudo .
por 20.08.2014 / 15:08
1

O Sudo cria uma variável de ambiente "SUDO_USER" que você pode usar para descobrir o usuário que efetuou login (na verdade quem executou o Sudo).

Supondo que o Sudo faça root (é possível usar o Sudo para acessar outros usuários também), você pode escrever um script para automatizar os dois passos a seguir.

cp source target
chown $SUDO_USER target

(Isso não funcionará se você sudo para um usuário não root, pois somente o root pode distribuir arquivos.)

Automatizar isso será um pouco trabalhoso. Se a origem for um único arquivo e o destino não for um diretório, seu trabalho estará concluído. Eu suponho que você fez a pergunta porque o problema é apenas um problema real em situações mais complexas, por exemplo, ao fazer algo como:

cp /path/source/some*files /path/target/directory/

Um script complexo para descobrir quais arquivos e quais diretórios são passados, quais deles eram pré-existentes, quais foram realmente sobrescritos e para alterar a propriedade de apenas os arquivos copiados com êxito podem ser gravados.

Este trabalho já foi feito. Você pode usar cpio - Após o sudo para root, use o cpio para copiar os arquivos. O cpio precisa de uma lista dos arquivos a serem copiados, por isso é um processo de duas etapas. Abaixo eu uso ls para gerar a lista de arquivos para copiar.

ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/

O -pdm significa "Modo de passagem, Criar diretórios conforme necessário, Manter tempos de modificação do arquivo"

--owner $SUDO_USER" faz com que o usuário especificado possua os arquivos.

O operando final é o diretório onde o cpio deve armazenar os arquivos.

Para saber mais sobre o cpio awesomeness, acesse a página de manual do CPIO aqui

Fazer isso em um único comando sudo também é possível. Supondo que seu usuário tenha direitos para acessar os arquivos, use o sudo apenas para a parte do cpio, desta forma:

ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/

No caso acima, estou usando $ USER em vez de $ SUDO_USER, porque ele é avaliado antes de o Sudo ser executado. Como alternativa, se o usuário não tiver acesso para listar os arquivos, coloque-o em um script de wrapper e use o sudo para executar o wrapper. Isso pode se tornar mais difícil, mas no caso mais simples O wrapper aceita dois argumentos, uma origem e um destino.

Isso vai para o wrapper "cp_as_user":

ls $1 | cpio -pdm --owner $SUDO_USER $2

Em seguida, use o wrapper assim:

sudo cp_as_user "/ caminho / para / alguns arquivos *" / caminho / para / target / diretório

    
por 27.08.2014 / 11:28

Tags