在未登录 Mac 时复制文件的脚本

在未登录 Mac 时复制文件的脚本

我们需要对其中一台 Mac 进行粗略的备份 - 无论是否有人登录,我们都需要每天将文件从其中复制到 Windows 文件服务器一次。我可以找到在用户登录且 Windows 共享已安装时执行此操作的脚本,但我无法找到在用户未登录时执行此操作的方法。

有没有 unix / osx 极客知道如何做到这一点?

答案1

在无人登录时运行脚本

要运行一个无论用户是否登录都会运行的守护进程,您需要查看 launchd 来管理实际执行备份的脚本。自 Mac OS X 10.4 以来,cron 已被一个名为的程序取代启动手册页) 将 cron、init.d、rc 和其他几个实用程序整合到一个程序中。

作为参考,launchd 运行启动代理(当用户登录时以用户身份运行)和启动守护程序(无论用户何时登录都运行)。这些任务由 xml .plist 文件定义,该文件可在以下位置之一找到:

/System/Library/LaunchDaemons(系统任务 - 不修改)、
/Library/LaunchAgents(任何用户登录时运行的计算机范围任务)、
/Library/LaunchDaemons(无论谁登录都运行的计算机范围任务)、
~/Library/LaunchAgents(用户登录时运行的用户特定任务)。

关于加载、卸载等的更多信息都可以在手册页中找到。

我发现的最简单的方法是创建一个 shell 脚本来运行备份。

然后,您可以通过放入以下 ​​.plist 文件来加载它并运行它/Library/LaunchDaemons,然后运行sudo launchctl load -w /Library/LaunchDaemons/org.example.script.plist以加载它并运行。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>org.example.script</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/PATH/TO/BACKUP/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <false/>
    <!-- This runs the script every day at 2AM -->
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>2</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</dict>
</plist>

此外,如果你想编辑或创建 launchd plists,我建议你查看林贡用于编辑和创建此类 .plist 文件的 GUI。

备份脚本

一个非常简单的备份脚本可能涉及以下元素:

1)安装Windows文件共享:

例如。

mkdir /tmp/MountLocation
mount -t smbfs //domain;user:password@server/sharepath /tmp/MountLocation

2)使用 rsync 备份文件。

3)完成后卸载Windows文件共享:

例如。

if [`umount /tmp/MountLocation`] 
then 
    rmdir /tmp/MountLocation
fi

更多信息mount -t smbfs请参见手册页或者人坐骑

小警告

另一方面,需要注意的是,在 Tiger (10.4) 中,StartCalendarInterval 在处理睡眠时有一个相当烦人的错误,该错误已在 Leopard (10.5) 及更高版本中修复。

答案2

我强烈建议您查看“cron”命令。它允许您在不同时间重复安排任意命令行任务。

答案3

除了 cron,如果你只想保留所有文件的最新副本,rsync 也可能有用。以下是如何来自 Ubuntu 论坛,该论坛描述的过程与您在 OS X 中执行的过程非常相似。您可以跳到 rsync 部分,并且可以使用 fink 或 macports 替代 aptitude 命令来获取软件包。

这些说明看起来有点复杂,但是一旦你开始做,它就不会太难。

答案4

您需要编写一个脚本,该脚本创建挂载点,在该挂载点使用 mount_smbfs 挂载 Windows 服务器,复制文件,然后卸载服务器。您必须决定如果有用户登录,您想要什么行为——您可能不希望他们尝试两次挂载同一个共享。以下是我用于类似任务的脚本的一些片段(顺便说一句,很好的格式将每个 bash 注释变成标题,O Server Fault 团队):`

  • 首先,创建挂载点

如果 [ -e /private/tmp/Volumes ] ; 则 mkdir /private/tmp/Volumes/Terminal/ 否则 mkdir /private/tmp/Volumes/ mkdir /private/tmp/Volumes/Terminal/ fi

  • 现在,在那里安装 Sophos 计算机

mount_smbfs //用户名:[电子邮件保护]/InterChk /private/tmp/Volumes/终端

  • 如果挂载不成功,则放弃!

如果 [ !-e /private/tmp/Volumes/Terminal/ESXP ] ; 然后退出 fi

  • 备份当前 Sophos 文件夹之前,请先删除旧的 Sophos 文件夹

如果 [ -e /Library/WebServer/Documents/Sophos.old ] ; 然后 rm -r /Library/WebServer/Documents/Sophos.old fi

如果 [ -e /Library/WebServer/Documents/Sophos ] ; 然后 mv /Library/WebServer/Documents/Sophos /Library/WebServer/Documents/Sophos.old fi

  • 创建新的

mkdir /图书馆/ Web服务器/文档/ Sophos

  • 并复制最新的 CID

cp -Rp /private/tmp/Volumes/终端/ESXP /库/Web服务器/文档/Sophos/ESXP cp -Rp /private/tmp/Volumes/终端/ES9x /库/Web服务器/文档/Sophos/ES9x cp -Rp /private/tmp/Volumes/终端/ESOSX /库/Web服务器/文档/Sophos/ESOSX cp -Rp /private/tmp/Volumes/终端/savlinux /库/Web服务器/文档/Sophos/savlinux

  • 设置 Web 访问权限

chown -R _www /图书馆/ Web服务器/文档/ Sophos

  • 并卸载卷

卸载/private/tmp/Volumes/终端/

  • 并删除挂载点

rmdir /private/tmp/Volumes/Terminal/`

希望这能帮助您入门。然后使用 cron 或 launchd 来设置重复计划,或者如果您愿意,您可以将其设置为注销脚本,这样当用户注销时它会自动备份文件。

相关内容