1

我需要在 Mac OS X Mountain Lion 上设置一个 shell 脚本,以使用 SSH 连接(隧道)或 SFTP 将本地目录同步到远程目录(Web 服务器),并让它每 30 秒连续运行一次。

我还需要从同步中排除某些文件或文件夹。

同步将是单向的(mac -> webserver)。

我需要实现的基本参数如下:

Local path: /Volumes/path/to/local/directory
Remote server: example.com
username: someUser
password: somePassword
Remote path: /path/from/server/root/to/htdocs
Files to exclude: '.ht*', '*.sublime-*'
Folders to exclude: 'cache','administrator/cache'

我还需要帮助编写 crontask 并将其添加到我的系统中以自动执行。

任何帮助将不胜感激。

4

2 回答 2

1
  1. 您应该考虑使用用户名/密码来进行 ssh 密钥身份验证,因为您必须以明文形式存储它们。SSH 密钥认证方法

  2. 使用您的排除项创建一个文件并调用它,例如。excludeList.lst(请参阅rsync 排除文件 - 示例

  3. 的命令rsync是这样的(阅读文档:man rsync,有很多例子,包括你的问题的解决方案)

    rsync -avz --exclude-from 'excludeList.lst' /Volumes/path/to/local/directory -e ssh somUser@example.com:/path/from/server/root/to/htdocs

  4. 测试脚本

  5. 添加cron cron 作业 - 每 30 秒launchd 在 Mac 上每 30 秒运行一次脚本

顺便提一句。你也可以进行这项研究……</p>

于 2012-10-31T11:23:38.917 回答
1

这是我要做的:

首先,测试是否可以使用 ssh(使用用户名和密码登录):

$ ssh example.com
^D

创建 SSH 密钥:

$ ssh-keygen

(不要输入密码)

这将创建~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥文件)

您需要将公钥 ( id_rsa.pub) 传输到远程服务器 ( example.com),然后在远程服务器上执行以下操作:

$ cat id_rsa.pub >> ~/.ssh/authorized_keys
$ rm id_rsa.pub
^D

这会将公钥添加到授权密钥集中。

您现在可以使用 ssh 连接到远程服务器,而无需使用用户名和密码。

接下来是使用 rsync 命令,以下内容就足够了:

$ rsync -avz -e ssh 
     --exclude '*.ht*' --exclude '*.sublime-*' --exclude 'cache/' 
     --exclude 'administrator/cache'
     someUser@example.com:/directory/on/server /directory/on/local

(应该都在一条线上)

现在,一旦您对这对您感到满意,您就想将该命令放入一个 shell 脚本 ( rsync_script.sh)

然后,您可以使用launchctl它来安排它:

~/Library/LaunchAgents/, 创建com.example.rsync.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.example.rsync</string>
    <key>KeepAlive</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/path/to/rsync_script.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>30</integer>
</dict>
</plist>

几个陷阱:

  • 确保 rsync_script.sh 是可执行的,即执行chmod 755 /path/to/the/rsync_script.sh
  • 确保创建 SSH 密钥的用户与设置launchdplist 的用户相同。
于 2012-10-31T11:28:33.347 回答