Wie kopiere ich ein Verzeichnis, auf das root nicht zugreifen kann, in ein Verzeichnis, auf das nur root zugreifen kann?

11

Ich habe ein Verzeichnis auf einem NFS-Mount, das sich auf dem Server befindet /home/myname/.rubies

Root kann nicht auf dieses Verzeichnis zugreifen:

[mitchell.usher@server ~]$ stat /home/mitchell.usher/.rubies
  File: `/home/mitchell.usher/.rubies'
  Size: 4096            Blocks: 8          IO Block: 32768  directory
Device: 15h/21d Inode: 245910      Links: 3
Access: (0755/drwxr-xr-x)  Uid: (  970/mitchell.usher)   Gid: (  100/   users)
Access: 2016-08-22 15:06:15.000000000 +0000
Modify: 2016-08-22 14:55:00.000000000 +0000
Change: 2016-08-22 14:55:00.000000000 +0000

[mitchell.usher@server ~]$ sudo !!
sudo stat /home/mitchell.usher/.rubies
stat: cannot stat `/home/mitchell.usher/.rubies': Permission denied

Ich versuche, etwas aus diesem Verzeichnis zu kopieren, auf /optdas nur root Zugriff hat:

[mitchell.usher@server ~]$ cp .rubies/ruby-2.1.3/ -r /opt
cp: cannot create directory `/opt/ruby-2.1.3': Permission denied

[mitchell.usher@server ~]$ sudo !!
sudo cp .rubies/ruby-2.1.3/ -r /opt
cp: cannot stat `.rubies/ruby-2.1.3/': Permission denied

Natürlich kann ich Folgendes tun (und das habe ich vorerst getan):

[mitchell.usher@server ~]$ cp -r .rubies/ruby-2.1.3/ /tmp/
[mitchell.usher@server ~]$ sudo cp -r /tmp/ruby-2.1.3/ /opt/

Gibt es eine Möglichkeit, dies zu tun, ohne es als Zwischenschritt zu kopieren oder Berechtigungen zu ändern?

Mitch
quelle
cp -Rp /home/mitchell.usher/.rubies /tmp/templocation; sudo mv /tmp/templocation/ruby-2.1.3 /optWird das nicht funktionieren? Wenn nein, warum?
MelBurslan
@ MelBurslan das habe ich getan, wie in der Frage angegeben. Aber nehmen wir an, es ist eine 50-GB-Datei, die nirgendwo anders in das Dateisystem passt, dann wäre ich nicht in der Lagecp <file> /tmp/tmpfile
Mitch

Antworten:

29

Sie können tarals Pufferprozess verwenden

cd .rubies
tar cf - ruby-2.1.3 | ( cd /opt && sudo tar xvfp - )

Der erste wird tarwie Sie ausgeführt und kann so Ihr Home-Verzeichnis lesen. der zweite tarläuft unter sudound kann so schreiben /opt.

Stephen Harris
quelle
1
Wie ist das im Gedächtnis? Wenn ich eine 10-GB-Datei habe, wird diese dann 10 GB Speicher füllen, bevor sie weitergeleitet und nicht geteert wird, oder wird sie nicht tariert, wenn sie geteert wird?
Mitch
5
Sie laufen parallel; Eine typische Pipe hat einen 64-KByte-Puffer. Kein Grund zur Sorge :-) unix.stackexchange.com/questions/11946/… für Details zur Rohrgröße .
Stephen Harris
cpiokann auf die gleiche Weise verwendet werden.
Toby Speight
Wenn Sie GNU tar haben, können Sie die Subshell speichern, indem Sie das -CArgument verwenden, um das Verzeichnis zu ändern (dh tar cf - ruby-2.1.3 | sudo tar -C /opt xpf -). Erwähnenswert ist möglicherweise, dass Sie sicherstellen möchten, dass sudoIhr Passwort nicht abgefragt wird (z. B. durch einen sudoersEintrag oder zwischengespeicherte Anmeldeinformationen).
Toby Speight
6

Sie können rsyncoder scpzum Kopieren user@localhostin das lokale Verzeichnis verwenden.

Beispiel für rsync:

# rsync "$real_user@localhost:$PWD/.rubies/ruby-2.1.3" /opt

Sie könnten alternativ

$ rsync .rubies/ruby-2.1.3 "root@localhost:/opt"

Wenn Sie den Root-Zugriff direkt auf localhost zulassen (nicht empfohlen; normalerweise bevorzugen wir den Root-Zugriff über sudo).

Toby Speight
quelle
-4

Sie können einen zweiten Eintrag in der FAT (oder was auch immer) machen.
Ich mache das für meine HOSTSDatei. Ich habe einen Link in einem beschreibbaren Verzeichnis, der auf die Datei verweist, und er hat unterschiedliche Berechtigungen, sodass ich ihn /Hosts/HOSTSleicht ändern kann und die Änderungen in beide (dh "die eine") Datei (en) übernommen werden. Es sind 2 Einträge für 1 Datei. Ich erinnere mich nicht an den Befehl, sorry.

Für Sie /opterstellen Sie einen Link zu für alle Dateien in .rubies, und wenn Sie etwas ändern /opt, handelt es sich um dieselbe Datei wie in .rubies.

Ingenieur
quelle
4
Dies ist falsch und irreführend, abgesehen davon, dass die Frage nicht beantwortet wird.
Wildcard
Es ist nur falsch, weil wir es mit einem anderen Dateisystem zu tun haben. Der Antwortende bezog sich offensichtlich auf Hardlinks, die wie erwähnt funktionieren, obwohl sie für diese Frage nicht zutreffen.
Julie Pelletier
Danke Wildcard, ich hatte eine Zeile in meiner Antwort, in der es darum ging, ein paar Flacks zu bekommen, aber sie wurde herausgeschnitten, als Michael sie verbesserte. : p
Ingenieur