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

19

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

No momento, não vejo outra maneira senão usar os dois últimos comandos ( lspara esclarecer os casos 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 sudocomando.
  2. Não preciso especificar meu usuário atual (talvez usando uma variável?).
Belmin Fernandez
fonte
sudo cat /etc/foo.txt > ~/foo.txt. Os arquivos tendem a ser legíveis apenas pela raiz por um motivo, portanto, lembre-se disso ao fazer cópias legíveis por usuários não raiz.
jw013

Respostas:

32

Use em installvez de cp:

sudo install -o belmin /etc/foo.txt ~/foo.txt
Jenny D
fonte
Não estava ciente install. Obrigado.
Belmin Fernandez
4
@BelminFernandez: para acomodar sua segunda preferência:sudo install -o "$USER" /etc/foo.txt ~/foo.txt
Pausado até novo aviso.
14

Com um compatível com POSIXcp que puder sudo cp -p foo barpara preservar o seguinte metadados do arquivo ao copiar:

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

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

l0b0
fonte
2
Isso funciona apenas quando o arquivo original pertence ao usuário de destino.
Jenny D
4
Presumo que a pessoa que está executando o sudo não possui o arquivo original, caso contrário, não precisaria usar o sudo.
EightBitTony
@EightBitTony Você não precisa sudocopiar um arquivo que não possui. Você só precisa de acesso de leitura , afinal.
L0b0
Sim, digite errado da minha parte - mas presumo que o ID do usuário em questão também não possa ler o arquivo, porque ainda não precisaria do sudo. Portanto, devemos assumir que o ID do usuário que possui o arquivo final não tem acesso ao arquivo original. De qualquer forma, este não é um problema do sudo. Sua resposta sugere preservar um proprietário que devemos assumir que não é desejado.
precisa saber é o seguinte
2
É teoricamente possível que o arquivo seja de propriedade do usuário de destino, mas esteja localizado em um diretório no qual o usuário de destino não tem permissão para entrar. Mas não é muito provável :-)
Jenny D
8

Se você fizer:

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

Em seguida, ~/foo.txtele será aberto pelo shell como você (criado com suas credenciais) e sudoserá executado com o stdout redirecionado para isso.

No final, o arquivo será de sua propriedade.

Esse tipo de abordagem também ajuda a limitar as coisas feitas root. Aqui, ele rootusa apenas seu privilégio para abrir /etc/foo.txt, não faz o que é potencialmente prejudicial (abra um arquivo para escrever, que poderia ter consequências ruins se ~/foo.txtfosse um link simbólico, por exemplo).

Stéphane Chazelas
fonte
2
Isso pressupõe que o usuário possa gravar no diretório de destino.
27414 Johan Johan
3

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

Não há como sudogerenciar isso, pois tudo o que você sudoestá fazendo é mudar para o outro usuário para executar o comando.

Você vai precisar

  1. continue usando dois comandos (ou um comando composto)
  2. encontre outro comando (como install, visto em outra resposta)
  3. ou escreva um script e execute-o via sudo.
EightBitTony
fonte
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 seja root (é possível usar o Sudo para acessar outros usuários também), você pode escrever um script para automatizar as duas etapas 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 fornecer arquivos.)

Automatizar será um pouco de trabalho. Se a origem for um único arquivo e o destino não for um diretório, seu trabalho estará concluído. 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 diretórios são passados, quais foram preexistentes, quais foram realmente substituídos e para alterar a propriedade de apenas os arquivos copiados com êxito podem ser gravados.

Este trabalho já foi realizado. Você pode usar cpio- Depois do sudo para fazer root, use o cpio para copiar os arquivos. O cpio precisa de uma lista dos arquivos para copiar, por isso é um processo em duas etapas. Abaixo eu uso lspara gerar a lista de arquivos para copiar.

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

Os -pdmmeios "Modo de passagem, Criar diretórios conforme necessário, Manter tempos de modificação de arquivo"

--owner $SUDO_USER" faz com que o usuário especificado seja o proprietário dos arquivos.

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

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

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

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

No caso acima, estou usando $ USER em vez de $ SUDO_USER, porque é avaliado antes da execução do Sudo. Como alternativa, se o usuário não tiver acesso para listar os arquivos, coloque-o em um script de wrapper e use sudo para executar o wrapper. Isso pode se tornar mais difícil, mas, no caso mais simples, o wrapper recebe dois argumentos, uma fonte 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 / destino / diretório

Johan
fonte