exec cpはスクリプトからは失敗しますが、直接発行すると機能します。

exec cpはスクリプトからは失敗しますが、直接発行すると機能します。

SQL バックアップを Windows サーバーにコピーするスクリプトがあります。以下は /etc/fstab からの行です:

//my.win.box/share$ /winshare   cifs    credentials=/etc/credfile,dom=mydomain,uid=0,gid=0,file_mode=0600,dir_mode=0700 0 0

バックアップ スクリプトは次のとおりです。

バックアップ.sh:

# copy zipped sql exports to /winshare/db
find /backups/sql/*sql.gz -mtime +1 -exec cp {} /winshare/db \;

ルート権限でログイン(この場合はルートとして)

$ ./backup.sh
cp: cannot create regular file `/winshare/db/mydb_20130301.sql.gz': Permission denied

しかし、スクリプトではなくプロンプトからコマンドを発行すると、次のようになります。

$ find /backups/sql/*sql.gz -mtime +1 -exec cp {} /winshare/db \;

ファイルは期待どおりにコピーされました。ここでも、root としてログインします。

スクリプト内のコマンドが失敗し、同じコマンドがコンソールから機能する原因は何でしょうか?

答え1

このマシンの種類については何も書かれていませんが、私が最初に気づいたのは、backup.sh に、どのプログラムで実行するかを指定するためのインタープリタ行がないということです。必要なのは次のようなものです。

#!/bin/bash
export PATH=/bin:/usr/bin

find....your stuff..here

さて、これだけでは権限の疑問は解決しませんが、役に立つでしょう。シェルがソースにしていたシステム全体の .rc ファイルで、別の find コマンドが指定されていたり、それが何をしたかは誰にもわかりません。インタープリターを指定すれば、そのインタープリターの init ファイルを見ることができます。また、ログイン環境に、スクリプトにはない環境があるかもしれません。

関連情報