Se eu fizer um sudo cp /etc/foo.txt ~/foo.txt
, o novo arquivo será criado root
como o proprietário.
No momento, não vejo outra maneira senão usar os dois últimos comandos ( ls
para 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:
- Fazendo isso em um
sudo
comando. - Não preciso especificar meu usuário atual (talvez usando uma variável?).
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.Respostas:
Use em
install
vez decp
:fonte
install
. Obrigado.sudo install -o "$USER" /etc/foo.txt ~/foo.txt
Com um compatível com POSIX
cp
que pudersudo cp -p foo bar
para preservar o seguinte metadados do arquivo ao copiar:Se você deseja definir um usuário diferente, a solução da JennyD é a melhor.
fonte
sudo
copiar um arquivo que não possui. Você só precisa de acesso de leitura , afinal.Se você fizer:
Em seguida,
~/foo.txt
ele será aberto pelo shell como você (criado com suas credenciais) esudo
será 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, eleroot
usa 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.txt
fosse um link simbólico, por exemplo).fonte
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 (root
neste caso) para obter acesso.Não há como
sudo
gerenciar isso, pois tudo o que vocêsudo
está fazendo é mudar para o outro usuário para executar o comando.Você vai precisar
sudo
.fonte
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.
(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 usols
para gerar a lista de arquivos para copiar.ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
Os
-pdm
meios "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
fonte