Crontab执行shell脚本:挂载错误(13):权限被拒绝。

3
我有一个RasPi,我想每次重新启动时执行一个shell脚本来自动挂载文件夹。 脚本命令是: sudo mount -t cifs '文件夹路径' '挂载点' -o username=xxx,password=xxx,sec=ntlm
如果我手动使用它,它可以完美地工作,但是通过cronjob,它会响应“Mount Error(13): Permission denied”,无法执行挂载。 这意味着cronjob至少执行了该文件。
我的想法是手动挂载它,并检查/etc/fstab或/etc/mtab中是否禁用了自动挂载。由于它只是一个文件夹,因此我只在mtab中找到了它。 我不能在其中写入,但选项中没有“noauto”,所以一切都正确。
不确定它是否与crontab执行权限有关,但ls -lha /usr/bin/crontab的输出是-rwxr-sr-x 1。
如果你们中的任何人有任何线索如何解决这个问题,我将感激帮助。 谢谢
编辑1:
好吧,在经过数小时的努力后,它似乎在/home/pi/.config/lxsession/LXDE-pi/autostart.sh中运行(键入“sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart.sh”)。在那个文件中,我写了“@/home/pi/scripttoexecute.sh”。在我的执行脚本中,我写了“sudo mount -t cifs 'foldertomount' 'directorypath' -o credentials=/root/.smbcredentials,iocharset=utf8,file_mode=0777,dir_mode=0777,sec=ntlm”。显然,要使用smb凭据文件,请写“sudo nano /root/.smbcredentials”,在那里写“username=xxx”和下一行“password=xxx”以及可选域。 感谢大家,我希望这可能会节省其他人的时间。 不确定它是否与apt-get upgrade和apt-get update有关。
2个回答

4

这里有几个要点,首先每个用户都可以拥有自己的crontab。例如:

crontab -e # Edit crontab of current user
crontab -u root -e # Edit crontab of root user (might need sudo for this)
crontab -u www-data -e # Edit crontab of www-data user

另一件事是,如果您没有使用 crontab -e 来编辑文件,而是直接编辑 /etc/crontab 文件(例如使用 vim /etc/crontab),您可以实际指定要运行 cron 的用户:

* * * * * root mount -t cifs /path/to/folder /point/to/mount -o username=xxx,password=xxx,sec=ntlm

1
谢谢您的提前帮助。我之前使用了 crontab -e 命令来为实际用户编写计划任务,并将其写入 sudo crontab -e 中,这应该与 crontab -u root -e 相同,不是吗? 不管怎样,我会尝试您的建议并及时向您更新进展情况。 目前有点奇怪,有时它已经在启动时挂载,有时它按照我的要求挂载(cronlog 通知),有时我会遇到权限被拒绝的问题,这有点奇怪。 - LinkM
是的,sudo crontab -e 应该与 crontab -u root -e 相同,尽管对于后者,您可能需要使用 sudo。顺便说一下,我重新阅读了您的问题,并想知道为什么需要这个 cron?如果您希望在重新启动时运行此命令,则可能希望将命令放在在重新启动时运行的脚本中,而不是将其放在 cron 上。也许像 rc.local 这样的文件会有用。我不确定您要做什么,或者树莓派如何工作,但您可能会发现 这个 有用。 - drewyupdrew
1
好的,最终它可以工作了。不知道为什么它不能立即工作,但是rc.local文件最终是正确的。 对于所有遇到相同问题的人: "sudo nano /etc/rc.local",然后输入以下内容: "/bin/mount -t cifs 'foldertomount' 'mountpoint' -o username=xxx,password=xxx,sec=ntlm" 我仍然很困惑为什么一开始它不能工作,但非常感谢你的努力。 - LinkM
算了,我不明白这个系统到底是干什么的。 我把我的命令设置为rc.local中的注释->没有挂载。将其设置回rc.local后,它又可以工作了,之后我检查了我的LXDE-pi/autostart文件,并意识到我的启动脚本与该命令一起执行,想测试一下它是否与挂载有关。将其设置为注释但保持rc.local处于活动状态->不再挂载。 我不明白,如果有人知道为什么会这样,请告诉我。 否则,随便怎么样,只要它能工作就行了哈哈。 - LinkM
@LinkM 这就是软件精神!要么是“我的代码不起作用,我也不知道为什么!”要么是“我的代码确实起作用,我也不知道为什么!” - drewyupdrew
我不喜欢这两种情况,哈哈,但你是对的,我的朋友。 - LinkM

1
在重启时通过 root 的 crontab 运行,请键入:
sudo crontab -e

并添加这一行:


@reboot mount -t cifs 'folderpath' 'pointtomount' -o username=xxx,password=xxx,sec=ntlm

但是,你应该将你的自动挂载点添加到/etc/fstab吗?


我确实这样做了...不知道为什么,但它没有起作用。 尝试通过rc.local挂载它,但出了问题,并不清楚如何在fstab中编写。不知怎么的,从某一天开始每次都能正常工作。肯定不是通过crontab,因为我禁用了脚本,它仍然被挂载了。 现在不知道它是如何被挂载的,但它可以工作了... 感谢建议和教程,我会尝试一下以确保每次都会挂载。 - LinkM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接