ルートがアクセスできないディレクトリをルートだけがアクセスできるディレクトリにコピーする方法は?


11

私はnfsマウントにディレクトリがあり、サーバー上にあります /home/myname/.rubies

ルートはこのディレクトリにアクセスできません:

[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

/optルートのみがアクセスできるディレクトリ内から何かをコピーしようとしています:

[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

明らかに、私は次のことを行うことができます(そして、当分の間私がやったことです):

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

中間ステップとしてコピーしたり、権限を変更したりする必要のない方法はありますか?


cp -Rp /home/mitchell.usher/.rubies /tmp/templocation; sudo mv /tmp/templocation/ruby-2.1.3 /optこれは機能しませんか?いいえの場合、なぜですか?
MelBurslan 2016

質問で述べたように、@ MelBurslanは私がやったことです。しかし、それがファイルシステムのどこにも収まらない50 GBのファイルだとすると、私はできませんcp <file> /tmp/tmpfile
Mitch

回答:


29

tarバッファプロセスとして使用できます

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

最初のものtarはあなたと同じように走るので、あなたのホームディレクトリを読むことができます。2番目tarが実行されるsudoため、に書き込むことができます/opt


1
これはメモリ上でどうですか?私が10 GBのファイルを持っている場合、それはそれがパイプしてtarを解凍する前に10 GBのメモリを埋めるのでしょうか、それともtarとしてtarを解凍しますか?
ミッチ

5
それらは並行して実行されます。一般的なパイプには64Kバイトのバッファーがあります。パイプサイズの詳細については、:-) unix.stackexchange.com/questions/11946/…について心配する必要はありません 。
スティーブンハリス


cpioほぼ同じ方法で使用できます。
Toby Speight

GNU tarを使用している場合は、-C引数を使用してディレクトリを変更することにより(つまりtar cf - ruby-2.1.3 | sudo tar -C /opt xpf -)、サブシェルを保存できます。sudosudoersエントリやキャッシュされた資格情報などを介して)パスワードが要求されないことを確認する必要があることに言及する価値があるかもしれません。
Toby Speight

6

rsyncまたはscpを使用しuser@localhostて、ローカルディレクトリにコピーできます。

の例rsync

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

あるいは、

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

rootがlocalhostに直接アクセスできるようにする場合(非推奨。通常は、を介したrootアクセスが推奨されますsudo)。


-4

FAT(またはその他)に2番目のエントリを作成できます。
私は自分のHOSTSファイルに対してこれを行います。ファイルを参照する書き込み可能なディレクトリにリンクがあり、アクセス権が異なるため/Hosts/HOSTS、簡単に変更でき、変更は両方(つまり「1つ」)のファイルに入れられます。1つのファイルに2つのエントリがあります。コマンドを覚えていません、すみません。

あなたにとっては、の/optすべてのファイルへのリンクを作成し.rubies、で何かを変更すると/opt、それはと同じファイルになり.rubiesます。


4
これは誤りであり、誤解を招くだけでなく、質問に答えません。
ワイルドカード

別のファイルシステムを扱っているため、これは誤りです。回答者は明らかにこのように動作するハードリンクを参照していましたが、この質問には適用されません。
ジュリーペルティエ

ワイルドカードに感謝します。一連のフラックを取得することについて私の回答に一行ありましたが、マイケルが改善したときに編集されました。:p
エンジニア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.