为了设置两台服务器间的免密登录并同步特定目录,我们需要完成几个步骤。首先,我们需要在两台服务器上配置SSH免密登录。接着,我们可以编写一个shell脚本,使用rsync
命令来同步目录。
生成SSH密钥(如果尚未生成):
在192.168.1.88上执行:
ssh-keygen -t rsa
按提示操作,不要输入密码,这样就会在~/.ssh/id_rsa.pub
生成公钥。
复制公钥到192.168.1.188:
在192.168.1.88上执行:
ssh-copy-id -i ~/.ssh/id_rsa.pub mml3@192.168.1.188
输入密码XXXXXX
,完成后应能免密码登录到192.168.1.188。
反向操作:
同样的步骤也需要在192.168.1.188上执行,复制其公钥到192.168.1.88。
这个脚本将使用rsync
命令同步指定的目录。请确保两台服务器上都安装了rsync
。
#!/bin/bash
# 定义源服务器和目标服务器的地址
SOURCE_SERVER="mml3@192.168.1.188"
DEST_SERVER="mml3@192.168.1.88"
# 定义需要同步的目录
DIRS=(
"/home/mml3/app/data/mml3/back"
"/home/mml3/app/data/mml3/error"
"/home/mml3/app/data/ftpserver/soft_scu"
"/home/mml3/app/data/ftpserver/soft_sle"
"/home/mml3/app/data/ftpserver/parameter"
)
# 日志文件路径
LOG_FILE="/var/log/sync_dirs.log"
# 循环同步每个目录,并将输出记录到日志文件
for dir in "${DIRS[@]}"; do
echo "Starting sync for $dir at $(date)" >> $LOG_FILE
rsync -avz --delete $SOURCE_SERVER:"$dir" "$dir" >> $LOG_FILE 2>&1
echo "Finished sync for $dir at $(date)" >> $LOG_FILE
done
保存脚本:将上述脚本保存为sync_dirs.sh
,并赋予执行权限:
chmod +x sync_dirs.sh
编辑Crontab:
使用crontab -e
命令编辑定时任务,使其同时记录标准输出和错误输出。
*/5 * * * * /path/to/sync_dirs.sh >> /path/to/cron.log 2>&1
这会将脚本执行的所有输出(包括错误)重定向到指定的cron日志文件中。
通过这些修改,您将能够在/var/log/sync_dirs.log
和/path/to/cron.log
中查看同步操作和定时任务的详细日志。这将有助于您监控同步过程,并在出现问题时进行故障排除。
这样配置后,192.168.1.88将每5分钟同步一次指定目录到192.168.1.188,保持两者的数据一致。注意,这个脚本是单向的,文件只从188的目录同步到88。
如果188出问题了,那么我们就需要把88上面的文件同步到188上面
以下是执行的步骤:
当192.168.1.188需要从192.168.1.88同步数据时,您可以进行一些调整来反转同步的方向。这意味着您需要修改脚本,使其从192.168.1.88同步数据到192.168.1.188。这可以通过调换rsync
命令中的源服务器和目标服务器来实现。
在您的现有脚本中,只需将rsync
命令的源和目标地址调换即可。以下是修改后的脚本示例:
#!/bin/bash
# 定义源服务器和目标服务器的地址
SOURCE_SERVER="mml3@192.168.1.88" # 源服务器地址改为192.168.1.88
DEST_SERVER="mml3@192.168.1.188" # 目标服务器地址改为192.168.1.188
# 定义需要同步的目录
DIRS=(
"/home/mml3/app/data/mml3/back"
"/home/mml3/app/data/mml3/error"
"/home/mml3/app/data/ftpserver/soft_scu"
"/home/mml3/app/data/ftpserver/soft_sle"
"/home/mml3/app/data/ftpserver/parameter"
)
# 日志文件路径
LOG_FILE="/var/log/sync_dirs.log"
# 循环同步每个目录,并将输出记录到日志文件
for dir in "${DIRS[@]}"; do
echo "Starting sync for $dir from $SOURCE_SERVER to $DEST_SERVER at $(date)" >> $LOG_FILE
rsync -avz --delete "$SOURCE_SERVER:$dir" "$DEST_SERVER:$dir" >> $LOG_FILE 2>&1
echo "Finished sync for $dir at $(date)" >> $LOG_FILE
done
保存脚本:将上述脚本保存为sync_dirs.sh
,并赋予执行权限:
chmod +x sync_dirs.sh
编辑Crontab:
使用crontab -e
命令编辑定时任务,使其同时记录标准输出和错误输出。
*/5 * * * * /path/to/sync_dirs.sh >> /path/to/cron.log 2>&1
rsync
有足够的权限来写入目标目录。crontab
)是在正确的服务器上设置的。如果您希望从192.168.1.88同步到192.168.1.188,那么定时任务应该在192.168.1.88上设置。为了监控同步操作的状态并了解是否同步成功或失败,您可以在脚本中添加日志记录功能。这可以通过将rsync
命令的输出重定向到日志文件来实现。同样地,您可以修改crontab
定时任务,以便它也记录执行的输出。
下面是如何修改您的脚本和crontab
以添加日志功能的步骤:
修改脚本以添加日志记录:
在脚本中添加日志记录的命令,将rsync
操作的输出重定向到一个日志文件中。例如:
#!/bin/bash
# 日志文件路径
LOG_FILE="/var/log/sync_dirs.log"
# 其他变量定义...
# 循环同步每个目录,并将输出记录到日志文件
for dir in "${DIRS[@]}"; do
echo "Starting sync for $dir at $(date)" >> $LOG_FILE
rsync -avz --delete $SOURCE_SERVER:"$dir" "$dir" >> $LOG_FILE 2>&1
echo "Finished sync for $dir at $(date)" >> $LOG_FILE
done
这里,>> $LOG_FILE 2>&1
会将标准输出和错误输出都重定向到日志文件。
确保日志文件可写:
确保运行脚本的用户对日志文件有写权限。