Sudo crea una variabile di ambiente "SUDO_USER" che puoi utilizzare per scoprire l'utente che ha effettuato l'accesso (in realtà chi ha eseguito Sudo).
Supponendo che Sudo sia root (è possibile usare Sudo anche per accedere ad altri utenti), è possibile scrivere uno script per automatizzare i due passaggi seguenti.
cp source target
chown $SUDO_USER target
(Questo non funzionerà se esegui sudo un utente non root poiché solo root può regalare file.)
Automatizzarlo richiederà un po 'di lavoro. Se l'origine è un singolo file e la destinazione non è una directory, il lavoro è fatto. Presumo che tu abbia posto la domanda perché il problema è solo un problema reale in situazioni più complesse, ad esempio quando si fa qualcosa di simile:
cp /path/source/some*files /path/target/directory/
Uno script complesso per capire quali file e quali directory vengono passate, quali erano preesistenti, quali erano effettivamente sovrascritte e per modificare la proprietà di solo i file copiati correttamente potevano essere scritti.
Questo lavoro è già stato fatto. Puoi usare cpio
- Dopo sudo to root, usa cpio per copiare i file. cpio ha bisogno di un elenco dei file da copiare, quindi è un processo in due fasi. Di seguito utilizzo ls
per generare l'elenco di file da copiare.
ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
I -pdm
mezzi "modalità Passthrough, creare directory, se necessario, ottenere tempi di modifica dei file"
--owner $SUDO_USER"
fa sì che l'utente specificato sia proprietario dei file.
L'operando finale è la directory in cui cpio deve archiviare i file.
Per saperne di più sulla bellezza di cpio, vai alla pagina del manuale CPIO qui
È anche possibile farlo con un singolo comando sudo. Supponendo che l'utente abbia i diritti per accedere ai file, usa sudo solo per la parte cpio, in questo modo:
ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/
Nel caso precedente sto usando $ USER invece di $ SUDO_USER perché viene valutato prima dell'esecuzione di Sudo. In alternativa, se l'utente non ha accesso all'elenco dei file, inseriscilo in uno script wrapper e usa sudo per eseguire il wrapper. Questo può diventare più difficile, ma nel caso più semplice Il wrapper accetta due argomenti, una sorgente e una destinazione.
Questo va nel wrapper "cp_as_user":
ls $1 | cpio -pdm --owner $SUDO_USER $2
Quindi utilizzare il wrapper in questo modo:
sudo cp_as_user "/ percorso / verso / alcuni * file" / percorso / verso / destinazione / directory
sudo cat /etc/foo.txt > ~/foo.txt
. I file tendono ad essere leggibili solo da root per un motivo, quindi ricorda di tenerlo a mente quando rendi le copie leggibili da utenti non root.