我有一个远程服务器文件系统,我正尝试通过 FUSE sshfs 和 Cron 将其本地挂载到 FreeBSD 9 机器上,以执行备份例程。我在两个机器之间设置了 ssh 密钥,允许在本地机器上以 root 用户身份进行无密码登录。
Cron设置为运行以下脚本(在Root的crontab中):
#!/bin/sh
echo "Mounting Share"
/usr/local/bin/sshfs -C -o reconnect -o idmap=user -o workaround=all <remote user>@<remote domain>.com: /mnt/remote_server
作为 root,我可以在命令行中毫无问题地运行此脚本,并且无需输入密码,共享即可成功挂载。但是,当由 Cron 运行时,脚本会失败。sshfs 的路径与which sshfs
以下是 root 从 Cron Daemon 收到的电子邮件:
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Mounting Share
fuse: failed to exec mount program: No such file or directory
fuse: failed to mount file system: No such file or directory
我很困惑为什么我会No such file or directory
在这种情况下收到。考虑到路径看起来是正确的,这似乎很奇怪。
我还尝试将env
shell 上的输出与env
插入到脚本中的输出进行比较。我没有看到任何会导致此问题的环境变量。在启动时,FUSE 将其版本报告为:
fuse4bsd: version 0.3.9-pre1, FUSE ABI 7.8
帮助我,ServerFault 向导,你是我唯一的希望!
答案1
事实证明,$PATH 环境变量是导致此问题的原因。修改上面的脚本,将 PATH 设置与 shell 相同,现在它可以正常工作:
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin"
export PATH
我想教训是永远不要对最小的 Cron 环境做出任何假设。