当连接可用时如何使用 fstab 挂载 FTP 资源?

当连接可用时如何使用 fstab 挂载 FTP 资源?

我想通过curlftpfs输入fstab如下命令来自动挂载 FTP 文件夹:

curlftpfs#user:pwd@myhost:port/folder/ /mnt/mymountfolder fuse allow_other,uid=1000,gid=1000,umask=0022,_netdev 0 0

通常它不会起作用,因为在启动期间我的笔记本电脑无法使用网络(通常是 wifi)。我读到_netdevfstab 中的选项应确保仅在网络可用时才进行安装,但我收到了以下消息:

Error connecting to ftp: Couldn't resolve host myhost

或者,我可以在登录后使用自动运行脚本挂载资源,但我更喜欢 fstab 解决方案。

最终目标是使用 crontab rsync 将本地文件夹与 ftp 文件夹同步,因此如果您有其他建议,我将不胜感激!

答案1

由于您的目标是“使用 crontab rsync 将本地文件夹与 ftp 文件夹同步”,我建议您编写一个小脚本来挂载 FTP、rsync、卸载 FTP。然后从 crontab 运行此脚本。

它应该是这样的:

#!/bin/bash
curlftpfs user:pwd@myhost:port/folder/ /mnt/mymountfolder
#might need sleep 1 here
rsync -a /mnt/mymountfolder /local/folder
fusermount -uz /mnt/mymountfolder

确保您在脚本上执行了 chmod +x。

crontab -e

#m h d M wd
0 * * * * /usr/local/bin/backup-script

另外,如果您确实希望始终挂载 FTP 文件夹,您可以编写一个挂载/卸载驱动器的脚本。如果您还将其添加到 fstab,则可以手动挂载驱动器。

fstab:

curlftpfs#user:pwd@myhost:port/folder/ /mnt/mymountfolder fuse noauto,user,uid=1000,gid=1000,umask=0022 0 0

网络挂载.sh:

#!/bin/bash
folder=/media/ftp
# check if host is alive
ping=`/usr/bin/fping -q host.dyn.org`
if [ $? == 0 ]; then
  # check if folder is mounted
  mountpoint $folder > /dev/null
  if [ $? != 0 ]
    # mount, timeout in case something goes wrong
    then timeout 10s mount $folder
  fi
  else
  mountpoint $folder > /dev/null
  if [ $? = 0 ]
    #unmount lazy (network down)
    then umount -l $folder
  fi
fi

将其添加到 crontab(crontab -e):

* * * * * /usr/local/bin/network-mount.sh

还要注意,在下一次运行之前,rsync 是否没有完成。这可以自动完成(检查 rsync 是否正在运行),也可以根据需要同步的数据量(rsync 所花费的时间,最坏情况)完成。

假设您没有为其他任何事情运行 rsync,则可以像这样检查它是否正在运行:

pgrep rsync
if [ $? == 0 ]; then
  # rsync running
  exit
else
  # rsync not running
  #do stuff
fi

答案2

我使用 SFTP / sshfs 来实现这个目的

echo password | sshfs username@serverIP:/ /mnt/mountpointfolder -p portnumber -o reconnect -o password_stdin

不确定是否有 fstab 方法。如果您每 x 分钟执行一次 cron 作业,那就没问题了。如果文件夹已挂载,您将只会收到“已连接”错误。如果您断开连接,您将收到另一个错误,并且不会建立连接。但是当您再次连接时,您将在一分钟内连接...如果是 cron 作业,您可以删除-o reconnect部分。

确保脚本文件的安全,因为它包含密码。

答案3

您可以尝试 curlftpfs 选项

connect_timeout=N(秒)。

在您的示例中(假设 30 秒就足够了),

curlftpfs#user:pwd@myhost:port/folder/ /mnt/mymountfolder,uid=1000,gid=1000,umask=0022,connect_timeout=30 0 0 fuse -o allow_other

或者,您可以从 fstab 中删除并在 Nautilus 中连接,然后将其保存为书签并在每次启动时连接。

相关内容