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 ls
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
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.