C'è un modo per dire a sudo di impostare il mio nome utente come proprietario per i file creati anziché root?


19

Se lo faccio sudo cp /etc/foo.txt ~/foo.txt, il nuovo file viene creato rootcome proprietario.

In questo momento, non vedo altro modo se non usare gli ultimi due comandi ( lsper chiarire il caso d'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: $_

Preferirei:

  1. Fallo in un solo sudocomando.
  2. Non è necessario specificare il mio utente corrente (magari usando una variabile?).

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.
jw013,

Risposte:



14

Con una compatibile con POSIXcp è possibile sudo cp -p foo barper preservare il seguente metadati del file durante la copia:

  • Tempo di accesso
  • Tempo di modifica
  • ID utente
  • ID gruppo
  • Modalità

Se vuoi impostare un altro utente, la soluzione di JennyD è la migliore.


2
Funziona solo quando il file originale è di proprietà dell'utente di destinazione.
Jenny D,

4
Presumo che la persona che esegue sudo non possieda il file originale, altrimenti non avrebbe bisogno di usare sudo.
EightBitTony,

@EightBitTony Non è necessario sudocopiare un file che non si possiede. Dopo tutto, hai solo bisogno dell'accesso in lettura .
l0b0

Sì, mistype da parte mia - ma presumo che l'ID utente in questione non sia in grado di leggere il file, perché non avrebbero ancora bisogno di sudo. Quindi dobbiamo supporre che l'ID utente destinato a possedere il file finale non abbia accesso al file originale. Ad ogni modo, questo non è un "problema" sudo. La tua risposta suggerisce che preservare un proprietario che dobbiamo presumere non sia desiderato.
EightBitTony,

2
È teoricamente possibile che il file sia di proprietà dell'utente di destinazione ma si trovi in ​​una directory in cui l'utente di destinazione non dispone dell'autorizzazione per entrare. Ma non è molto probabile :-)
Jenny D

8

Se fate:

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

Quindi ~/foo.txtsarà aperto dalla shell come tu (così creato con le tue credenziali), e quindi sudoverrà eseguito con il suo stdout reindirizzato a quello.

Alla fine, il file sarà di tua proprietà.

Questo tipo di approccio aiuta anche a limitare le cose fatte da root. Qui, rootutilizza solo il suo privilegio per aprire /etc/foo.txt, non fa ciò che è potenzialmente dannoso (aprire un file per la scrittura, che potrebbe avere conseguenze negative se ~/foo.txtfosse un collegamento simbolico per esempio).


2
Ciò presuppone che l'utente possa scrivere nella directory di destinazione.
Johan

3

Utilizzando sudo, si passa a un altro utente. Questo è l'intero punto del comando. Suppongo che non si abbia un accesso regolare al primo file, quindi è necessario essere un altro utente ( rootin questo caso) per ottenere l'accesso.

Non c'è modo per sudose stesso di gestirlo, poiché tutto sudociò che sta facendo è passare all'altro utente per eseguire il comando.

Avrai bisogno di

  1. continua a usare due comandi (o un comando composto)
  2. trova un altro comando (come install, visto in un'altra risposta)
  3. o scrivere uno script ed eseguirlo tramite sudo.

1

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 lsper generare l'elenco di file da copiare.

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

I -pdmmezzi "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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.