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 \;

root権限でログインします(この場合はroot)。

$ ./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 \;

ファイルが期待どおりにコピーされます。ルートとして再度ログインします。

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

ベストアンサー1

あなたはこれがどのタイプのマシンであるかは言っていませんが、私が最初に観察したのは、あなたのbackup.shにそれを実行する必要があるプログラムを指定するインタプリタ行がないことです。あなたは次のようなものが欲しい:

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

find....your stuff..here

今、これだけでは権限の問題は解決されませんが、役に立ちます。シェルが別のfindコマンドを指定するシステム全体の.rcファイルをインポートしたり、その機能を知っている人がいる可能性があります。インタプリタを指定すると、そのインタプリタの初期化ファイルを表示できます。さらに、ログイン環境にはスクリプトとは異なる状況がある可能性があります。

おすすめ記事