Use install
em vez de cp
:
sudo install -o belmin /etc/foo.txt ~/foo.txt
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:
sudo
. Com um compatível com POSIX cp
, você pode sudo cp -p foo bar
a preserve os seguintes metadados de arquivo ao copiar:
Se você quiser definir um diferente usuário a solução da JennyD é melhor.
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>
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á
sudo
. 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