
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 ファイルを見ることができます。また、ログイン環境に、スクリプトにはない環境があるかもしれません。