『ボヘミアン・ラプソディ』はなぜ人々を魅了したのか >>

マウントしたディスクにcpで、所有者などがコピーできない。

Linuxサーバー上で、NFSマウントした外部ディスクに、cpコマンドでバックアップを取っています。(cronで夜間に実行)

コピーは正しくおこなわれているのですが、
 ・パーミッション
 ・所有者
 ・グループ
が正しくコピーされておらず、ログには
cp: failed to preserve ownership for `(ファイル名)': Operation not permitted
と出ています。※権限がないと言ってることくらいは理解できます。
また、コピーされたファイルのユーザーと所有者は「nfsnobody」になっています。

パーミッションや所有者、グループも含めてコピーしたいと思っているのですが、どのようにすればよいのでしょうか?

<補足>
・コピーは「cp -fpR」でやっています。
・cronでシェルを起動してコピーを実行しています。
・cronはrootで実行しています。
・cronで実行せずに、直接シェルをたたいても同じです。
・Red Hat Enterprise Linux Server release 5.3 (Tikanga)です
・コピー先も同じRedhatです。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

NFSのサーバー側のデフォルトでは、NFSで所有者がrootのファイルを書き込めないようになっています。


(ローカルにroot権限をもっていない人間でも、root権限を持つ別のマシンを用意してNFSでマウントすれば、rootなファイルを書き込める、というのはセキュリティ的に問題があるため)

NFSのサーバー側(コピー先)で、/etc/exports で、no_root_squash を設定すれば、
rootでも書き込めるようになります。
http://www.linux.or.jp/JM/html/nfs-server/man5/e …
http://mountainbigroad.jp/fc5/nfs.html#p02_01
    • good
    • 1
この回答へのお礼

確認したところ、手動でもcronでも所有者等含めてコピーできるようになりました。
ありがとうございます!

また、セキュリティ的な問題も理解しました。合わせてありがとうございます。
こちらは、IP指定でローカルIPの特定マシンからのみ読み書き可能ということで、対処する
ようにしました。

お礼日時:2010/08/30 18:55

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q書き込み権限が無いためコピーできない

フォルダーの中のファイルやフォルダーをほかのフォルダーにコピーをしたり移動をすると「このフォルダーの書き込み権限がありません」というエラーが出ます。
~$su
~# にして、コピペしても,コマンドからコピーしても同じ結果です。
なぜでしょうか?
OSはebian GNU/etchです。

過去ログを参考にしたのですが、その回答を引用すると
>
エラー対象のフォルダが
所有者:root
パーミッション:read olny
となっていませんか?
$ ls -lコマンドで確かめてください。
dr-------- xx root xxx
と表示されませんか。?そうであれば
$ chmod u+w エラーとなるフォルダ
で書き込み属性を追加して下さい。

で、その通りしてみたのですが。

~$ ls -l /etc/sj□□□
合計 24
drwxr-xr-x 2 book book 4096 2009-04-20 15:18 □□□d
-rw-rw---- 1 book book 393 2009-04-20 15:23 □□□.inc
-rw-r--r-- 1 root root 299 2009-04-20 15:23 □□t
-rw-r--r-- 1 root root 873 2009-04-20 15:23 □□□
-rw-r--r-- 1 root root 2086 2009-04-20 15:23 □□.env
-rw-r--r-- 1 root root 0 2009-04-20 15:23 □□.inc
-rw-r--r-- 1 root root 0 2009-04-20 15:23 □□.inc
-rw-rw---- 1 book book 49 2010-01-16 01:33 passwd
となります。

ちなみに、
/etc/sj□□□ のプロパティでアクセス権 をみるとroot root
コピーしたいファイル のプロパティでアクセス権 をみると アカウントユーザ名 ユーザーの本名となっていて、両者全然別物です。

とりあえず言われた通り
~$ chmod u+w /etc/sj□□□
してみたら
chmod: changing permissions of `/etc/sj□□□': 許可されていない操作です。
となるし、
chown でコピーしたいファイルの方を root:root に書き換えてみましたが
これもエラーがでました。

どなたか解決策教えてください。

フォルダーの中のファイルやフォルダーをほかのフォルダーにコピーをしたり移動をすると「このフォルダーの書き込み権限がありません」というエラーが出ます。
~$su
~# にして、コピペしても,コマンドからコピーしても同じ結果です。
なぜでしょうか?
OSはebian GNU/etchです。

過去ログを参考にしたのですが、その回答を引用すると
>
エラー対象のフォルダが
所有者:root
パーミッション:read olny
となっていませんか?
$ ls -lコマンドで確かめてください。
dr-------- xx root xxx
と表示さ...続きを読む

Aベストアンサー

root になったら、出来ないことはないくらいの権限が与えられるはずなのですが・・・

/etc にあるファイルって、全部といっていいくらい root の所有ファイルだと思うのですが、book さん所有のファイルも入ってるってことですか。

book さんのファイルの所有者を root に変更する場合、御存じだとは思いますが、まず
 $ su
 # chown root.root foo (foo は任意のファイル名のことです)
とやれば、何らかのファイル(ここでは foo)の所有者は root.root になるはずです。

けれど、ファイルをコピーするのに、/etc の中で所有者を変更する必要もないのでは?
たとえば、/etc 以下の foo というファイルを、自分のホームディレクトリにコピーしようと思えば、
 $ cp /etc/foo /home/watashi/ (watashi は、ホームディレクトリのユーザー・アカウント)
とすればコピーできてしまうはずです。
その後で、ホームディレクトリで root に変身して
 # chown watashi.watashi foo
とすれば、ホームディレクトリ下の foo というファイルの所有者は watashi になりますから、
 # exit
とやって、元の身分(?)に戻ってから、そのファイルに対する処理を行えばよいはずだと思います。

> ~$ chmod u+w /etc/sj□□□

これは、当該ファイルの所有者が自分に変更された後なら分りますが、所有権がないのに実行しても、エラーになるのではないでしょうか。
私だったら、その前にコピーをすませておいて、そのコピーされたファイルの所有者を変更してから、
 $ chomod u+w sj□□□
とします(つまり、/etc にある方のファイルは、設定をいじらずに、そのままにしておきます)。
しかし、単にそのファイルの内容を見るだけなら、chmod は不要でしょう。

以上、かなり分りにくい書き方になったかもしれませんが、そもそも、仮に cp コマンドが効かないとしたら、何かが根本的におかしいのではあるまいかという気がします。

root になったら、出来ないことはないくらいの権限が与えられるはずなのですが・・・

/etc にあるファイルって、全部といっていいくらい root の所有ファイルだと思うのですが、book さん所有のファイルも入ってるってことですか。

book さんのファイルの所有者を root に変更する場合、御存じだとは思いますが、まず
 $ su
 # chown root.root foo (foo は任意のファイル名のことです)
とやれば、何らかのファイル(ここでは foo)の所有者は root.root になるはずです。

けれど、ファイルをコ...続きを読む

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Qapt-get install ****** でinstallしたものをuninstallするには?

御世話になります。
vncserverだけをinstallするつもりが
誤って
apt-get install vncとうってしまいました。
これをuninstallしたいのですが
どのようにすればよろしいでしょうか?

教えて下さい。

Aベストアンサー

# apt-get remove パッケージ名
では、設定ファイルは削除されずに残ります。

完全に削除するときは、
# apt-get --purge remove パッケージ名
です。

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

QNTPで同期が始まらない

こんにちは。
度々すみません、NTPの設定をしましたがどうも同期が始まりません。

「ntpdate 130.69.251.23」と手動同期は成功します。
しかしntpデーモンを起動し1時間以上放置しても同期されません。
※外部タイムサーバー参照としてます

ntp.confは下記のとおりです。
---------------------------------------------------
server 133.100.9.2 # clock.nc.fukuoka-u.ac.jp
server 130.69.251.23
driftfile /var/lib/ntp/drift
---------------------------------------------------

でntpq -pの結果は下記となります。

remote refid st t when poll reach delay offset jitter
==============================================================================
133.100.9.2 .INIT. 16 u - 64 0 0.000 0.000 4000.00
130.69.251.23 .GPS. 1 u 27 64 377 8.015 -99970. 17262.6

同期ができれば「remote」列に「*」が表示されると思っています。
何か設定が足りないでしょうか?。
尚、「/vat/log/message」をtailしてますが特にエラーは無さそうです。

よろしくお願いします。

こんにちは。
度々すみません、NTPの設定をしましたがどうも同期が始まりません。

「ntpdate 130.69.251.23」と手動同期は成功します。
しかしntpデーモンを起動し1時間以上放置しても同期されません。
※外部タイムサーバー参照としてます

ntp.confは下記のとおりです。
---------------------------------------------------
server 133.100.9.2 # clock.nc.fukuoka-u.ac.jp
server 130.69.251.23
driftfile /var/lib/ntp/drift
---------------------------------------------------

でntp...続きを読む

Aベストアンサー

#4のqaaqです。

○ntp.conf 関連
server 行に "iburst" を付けておきましょう。
server ntp.nict.jp iburst <--こんな感じになります。

ntp サーバ起動時の時刻調整の収束時間が早くなります。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ntp.conf&dir=jpman-5.4.0%2Fman&sect=0

○ntpdate での時刻調整
ntpdate -b -u [サーバ名] を複数回実行して、"offset の値が0.1以下"になるまで、強制的に時刻調整して下さい。

○ハードウエアclockの修正
hwclock -w コマンドでハードウエアclockを合わせます。
http://www.linux.or.jp/JM/html/util-linux/man8/hwclock.8.html

○ntpdの動作
ntpによる時刻調整は、調整幅が通常128mSと小さいので、1時間は様子をましょう。
2時間程度経過しても、時刻修正の兆候が見られない場合ハードウェアの不良も考えられます。

時刻調整の兆候としては、
・logファイルに 一時間毎に調整したメッセージが書かれる。
Jan 7 21:57:40 ntpd[91145]: offset 0.000994 sec freq -190.802 ppm error 0.000076 poll 8
・ntpq -p の出力の最初の桁に"*,+"が付く。また、reach が377になる。
% ntpq -np
remote refid st t when poll reach delay offset jitter
+192.168.0.102 GPS_NMEA(0) 2 u 3 32 377 0.926 -0.330 0.023
*192.168.0.192 GPS_NMEA(1) 2 u 10 32 377 0.747 -0.336 0.023
192.168.0.9 PPS(1) 2 u 3 32 377 0.757 6.559 0.161


○その他
・PC起動時には、システムクロックを計測してその後の動作の基準にしていますが、
CMOSバッテリ不足やハードウェアに何らかの異常があるととんでもない時刻を示すことがあります。(要修理です)
・BIOSの時計も起動時の初期時刻として使われてしまうので、ある程度合わせておいた方がいいです。

#4のqaaqです。

○ntp.conf 関連
server 行に "iburst" を付けておきましょう。
server ntp.nict.jp iburst <--こんな感じになります。

ntp サーバ起動時の時刻調整の収束時間が早くなります。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ntp.conf&dir=jpman-5.4.0%2Fman&sect=0

○ntpdate での時刻調整
ntpdate -b -u [サーバ名] を複数回実行して、"offset の値が0.1以下"になるまで、強制的に時刻調整して下さい。

○ハードウエアclockの修正
hwclock -w コマンドでハ...続きを読む

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Qシェルスクリプトの実行、「source」と「.」の違いについて

bashのシェルスクリプトを書いています。
当方、Mac Snow Leopard を使っているため、seq コマンドがデフォルトでは使えません。
そこで、.bashrc 内に、seq 関数をあらかじめ自分で定義して、他で使い回したいと思っています。
.bashrc の中に、
function seq() {
i=$1
while [ $i -le $2 ] ; do
echo $i
let i=$i+1
done
}
と、関数を定義しました。
seq 関数をターミナル上で実行すると、
>seq 0 2
0
1
2
と正しく、表示されます。次に、

#!/bin/sh
seq 0 2

と記述したシェルスクリプト(temp.sh)を「source」で実行すると、
>source temp.sh
0
1
2
と正しく、表示されますが、「.」で実行すると、
>./temp.sh
./temp.sh: line 2: seq: command not found
と言われます。
どのような理由によってこの違いが出るのでしょうか??

bashのシェルスクリプトを書いています。
当方、Mac Snow Leopard を使っているため、seq コマンドがデフォルトでは使えません。
そこで、.bashrc 内に、seq 関数をあらかじめ自分で定義して、他で使い回したいと思っています。
.bashrc の中に、
function seq() {
i=$1
while [ $i -le $2 ] ; do
echo $i
let i=$i+1
done
}
と、関数を定義しました。
seq 関数をターミナル上で実行すると、
>seq 0 2
0
1
2
と正しく、表示されます。次に、

#!/bin/sh
seq 0 2

...続きを読む

Aベストアンサー

追記

source は現在のシェルで実行し、結果がそのまま現在のシェルに適応されます。
今回の temp.sh なら
> source temp.sh

> seq 0 2
と入力したのと同等ということになります。

> ./temp.sh
この . はコマンドではなく、 temp.shへのパスを指定するものです。
実行ファイル名だけでコマンドとして実行できるのは、環境変数PATHで指定したディレクトリにあるものだけです。それ以外は、その実行ファイルへの絶対パス、または相対パスが必要となります。
これは、カレントディレクトリにある実行ファイルも例外ではありません。
環境変数PATHに . が無い場合は、 ./ファイル名 と相対パスを指定する必要があります。
(この点は、常に . がPATHにあるように振る舞うMS-DOSやコマンドプロンプトとは違います)
逆に、PATH上にあれば(例えば、 PATH=$HOME/bin:(以下略)となっている時の $HOME/bin )、 temp.sh とファイル名だけで実行できます。

また、こうしたコマンドは新規プロセスで実行されますので、環境変数を除いて、現在の設定は継承されません。
対話的ではないbashや、 shとして起動された bash は .bashrcを読まないので、そこに書いてあることは無効となります。

追記

source は現在のシェルで実行し、結果がそのまま現在のシェルに適応されます。
今回の temp.sh なら
> source temp.sh

> seq 0 2
と入力したのと同等ということになります。

> ./temp.sh
この . はコマンドではなく、 temp.shへのパスを指定するものです。
実行ファイル名だけでコマンドとして実行できるのは、環境変数PATHで指定したディレクトリにあるものだけです。それ以外は、その実行ファイルへの絶対パス、または相対パスが必要となります。
これは、カレントディレクトリにある実行...続きを読む

Q~以外を削除する場合(rmコマンド)

linuxのコマンドで
~以外のファイル、ディレクトリを全て削除したい時は
どのような記述をすれば良いのでしょうか?
シェルスクリプトではなくrmコマンド1つで削除したのいですが…

例: tar以外のファイル・ディレクトリを
   すべて削除したい場合など

どなたかご存知の方がいらっしゃったら
教えてください。よろしくお願い致します。

Aベストアンサー

rm コマンドのみという訳にはいきませんが基本的なコマンドを組み合わせると実現可能と思います。

「名前が tar で終わるもの以外のファイル・ディレクトリを削除する」場合だと

ls | grep -v -E 'tar$' | xargs rm -r

となります。

ファイルの一覧を取得し ( ls )
'tar'で終わるもの以外を抽出し ( grep )
その結果を rm -r の引数に指定して実行 ( xargs )

という流れです。

ファイルを削除するような操作については失敗するとダメージが大きいので、事前にテストして動作を確認すると良いとおもいます。また rm -r -i としてそれぞれのファイルについて、削除の問い合わせをするのも有効です。

Qシェルスクリプト実行で”そのようなファイルやディレクトリはありません”と出ます。

以下の単純なシェルスクリプトを実行しようとしています。
-------------------
#!/bin/sh
echo ok
-------------------
そのとき、
bad interpreter: そのようなファイルやディレクトリはありません
と出てしまいます。

・which sh で確認すると /bin/sh です。
・Windowsで作ったファイルをFTPのアスキーモードで転送しています。

(ものすごく単純なミスをしてるのかもしれませんが、)
よろしくお願いします。

Aベストアンサー

1行目の「/bin/sh」のうしろにCRが入っていると、このような現象が発生します。
FTPの転送モードが間違いなくアスキーモードになっているか、
転送後のファイルにCRがついていないかなど、再度確認してみてください。

CR以外のコントロールコードや全角スペースなどがついていても似た現象が起こります。
その場合はエラーメッセージが多少異なるはずですが、併せて確認しておくと良いかと思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング