我正在运行一个需要对不同子文件夹有特定权限的软件。因此我使用 crontab 来永久更新这些权限。
在一台服务器上,我使用一个 perl 脚本,该脚本将所有命令分组并由 crontab 逐一执行。
crontab 条目:
* * * * * root /root/Permissions.sh /dev/null 2&1
权限.sh:
#!/usr/bin/perl
system ("chmod -R 755 /pathToMainFolder/softwareFolder");
system ("chown -R root:user /pathToMainFolder/softwareFolder");
system ("chmod -R 775 /pathToMainFolder/softwareFolder/subfolder");
system ("chown -R root:user /pathToMainFolder/softwareFolder/subfolder");
system ("chmod -R 775 /pathToMainFolder/softwareFolder/someFile");
system ("chown -R root:user /pathToMainFolder/softwareFolder/someFile");
system ("chmod 775 /pathToMainFolder/softwareFolder");
这可以正常工作,但在另一台服务器上,该软件位于名称包含空格的子文件夹中
/pathToMainFolder/sub Folder/softwareFolder
我不知道如何编写 Permissions.sh 来包含这个空格,因为无论是否转义空格,该脚本似乎都不起作用。
两者都不:
system ("chmod -R 755 /pathToMainFolder/sub Folder/softwareFolder");
也不:
system ("chmod -R 755 /pathToMainFolder/sub\ Folder/softwareFolder");
似乎有效。
然后我尝试将这 7 条命令直接复制到 crontab 中:
* * * * * root chmod -R 755 /pathToMainFolder/sub\ Folder/softwareFolder
* * * * * root chown -R root:user /pathToMainFolder/sub\ Folder/softwareFolder
* * * * * root chmod -R 775 /pathToMainFolder/sub\ Folder/softwareFolder/subfolder
* * * * * root chown -R root:user /pathToMainFolder/sub\ Folder/softwareFolder/subfolder
* * * * * root chmod -R 775 /pathToMainFolder/sub\ Folder/softwareFolder/someFile
* * * * * root chown -R root:user /pathToMainFolder/sub\ Folder/softwareFolder/someFile
* * * * * root chmod 775 /pathToMainFolder/sub\ Folder/softwareFolder
这在某种程度上有所帮助,因为它们现在已经正确执行,但是 crontab 似乎不尊重命令的顺序。
Mar 1 10:19:01 local CRON[53069]: (root) CMD (chown -R root:user /pathToMainFolder/sub\ Folder/softwareFolder/subfolder)
Mar 1 10:19:01 local CRON[53070]: (root) CMD (chown -R root:user /pathToMainFolder/sub\ Folder/softwareFolder/someFile)
Mar 1 10:19:01 local CRON[53071]: (root) CMD (chmod -R 775 /pathToMainFolder/sub\ Folder/softwareFolder/subfolder)
Mar 1 10:19:01 local CRON[53073]: (root) CMD (chown -R root:user /pathToMainFolder/sub\ Folder/softwareFolder)
Mar 1 10:19:01 local CRON[53072]: (root) CMD (chmod -R 775 /pathToMainFolder/sub\ Folder/softwareFolder/someFile)
Mar 1 10:19:01 local CRON[53074]: (root) CMD (chmod -R 755 /pathToMainFolder/sub\ Folder/softwareFolder)
Mar 1 10:19:01 local CRON[53075]: (root) CMD (chmod 775 /pathToMainFolder/sub\ Folder/softwareFolder)
由于不同的命令以递归方式工作,因此按照正确的顺序执行它们至关重要。
我发现https://stackoverflow.com/questions/9639434/running-two-commands-sequencely-in-a-cron-job和https://help.ubuntu.com/community/CronHowto,因此我尝试使用 来按顺序&&
执行chown
和chmod
命令,但不知何故这根本不起作用。
* * * * * root chmod -R 755 /pathToMainFolder/sub\ Folder/softwareFolder && root chmod -R 775 /pathToMainFolder/sub\ Folder/softwareFolder/subfolder && root chmod -R 775 /pathToMainFolder/sub\ Folder/softwareFolder/someFile && root chmod 775 /pathToMainFolder/sub\ Folder/softwareFolder
* * * * * root chown -R root:user /pathToMainFolder/sub\ Folder/softwareFolder && root chown -R root:user /pathToMainFolder/sub\ Folder/softwareFolder/subfolder && root chown -R root:user /pathToMainFolder/sub\ Folder/softwareFolder/someFile
我没有收到错误消息,但执行其中一个ls -al
文件夹时显示命令未正确执行。
有什么方法可以修复 Permissions.sh,我认为这是让它重新工作的最佳方法,或者我在哪里犯了错误。
注意:我可以将整个软件移出子文件夹,但随后我必须在许多工作站上手动更改链接,这将非常麻烦。
答案1
- 为什么是 perl 而不是 bash?
使用 bash 和双引号。
#/bin/bash chmod -R 755 "/pathToMainFolder/sub Folder/softwareFolder" chown -R root:user "/pathToMainFolder/sub Folder/softwareFolder" chmod -R 775 "/pathToMainFolder/sub Folder/softwareFolder/subfolder" chown -R root:user "/pathToMainFolder/sub Folder/softwareFolder/subfolder" chmod -R 775 "/pathToMainFolder/sub Folder/softwareFolder/someFile" chown -R root:user "/pathToMainFolder/sub Folder/softwareFolder/someFile" chmod 775 "/pathToMainFolder/sub Folder/softwareFolder"
保存并从 cron 执行此脚本。