我有一个将 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 \;
文件按预期复制。再次以 root 身份登录。
什么可能导致脚本内命令失败,但相同的命令可以从控制台运行?
答案1
你没有说这是什么类型的机器,但我的第一个观察是你的 backup.sh 中没有解释器行来指定应该运行它的程序。你想要这样的东西:
#!/bin/bash
export PATH=/bin:/usr/bin
find....your stuff..here
现在,仅此并不能解决您的权限问题,但会有所帮助。您的 shell 可能正在获取一个系统范围的 .rc 文件,该文件指定了不同的 find 命令,或者谁知道它做了什么。通过指定解释器,您可以查看该解释器的初始化文件。另外,您的登录环境可能有脚本没有的环境。