有没有办法使用 Unison 自动同步多台计算机(即主文件夹中的特定目录)?如果没有,有没有其他方法可以做到这一点?我并不完全反对一直打开 Unison 并手动进行同步,但当它打开时,您必须选择一个配置文件,该配置文件仅对应一个目录,因此您必须分别同步每个目录。此外,IP 地址是动态的,因此必须进行编辑。这非常繁琐,似乎应该有一种更简单的方法。我遗漏了什么吗?有没有办法简化这个过程(可能是 bash 脚本)?
答案1
我的建议是解决动态 IP 的问题(大多数路由器都有地址保留的概念,您可以使用它来“修复”计算机的 IP)。之后,您可以使用 unison 的命令行版本:
unison -auto -batch profilename
您可以将其添加到您的登录/注销脚本或作为 cron 作业。
如果仍然需要更改 ip,则可以sed
在脚本中使用:
在 中创建一个模板文件
~/.unison
,newprof.tmpl
如下所示:root = /home/romano/ root = ssh://romano@MYIPHERE//home/romano/ path = education path = research
创建以下脚本,并将其命名为
sync_newprof
:#!/bin/bash # cd $HOME/.unison cat newprof.tmpl | sed s/MYIPHERE/$1 >! newprof.prf unison -auto -batch profilename
基本上,我们创建一个配置文件,使用脚本的第一个参数更改 MYIPHERE 字样
现在你可以称之为
sync_newprof 1.1.1.1
它将使用给定的 IP 创建配置文件并同步。
答案2
在本地网络上,您有两台机器,您希望/home/<username>/Desktop
每 10 分钟安全自动地同步一次:“主机”运行您的 OpenSSH 服务器,而“客户端”通过 SSH 连接到“主机”。
解决方案概述*
- 在主机上设置 OpenSSH 服务器
- 在客户端和主机上安装 Unison
- 创建脚本 1,以便
cron
可以使用的<username>
RSA 密钥 <username>
在crontab中添加两行,然后- 将脚本 1 设置为在启动时运行。
在主机上设置 OpenSSH 服务器
看设置 SFTP 服务器设置一个 OpenSSH 服务器,该服务器在<username>
主机上监听 SSH 连接,使用静态 IP,监听非标准端口,拒绝基于密码的连接,并且如果主机拥有 RSA 公钥则允许 RSA 密钥连接。
在客户端和主机上安装 Unison
在两台机器上运行(如果您需要的话,unison-gtk 是 GUI):
sudo apt-get install unison unison-gtk
创建一个脚本
cron
不共享相同的环境,<username>
因此无法找到连接主机所需的客户端 RSA 密钥。脚本 1 将该环境提供给 的<username>
crontab 文件。
脚本 1 还生成脚本 2,该脚本由<username>
的 crontab 文件每 10 分钟执行一次,并运行 Unison。
- 注意!我不是脚本专家,并且改编了此内容[1]
脚本1(/home/<username>/Documents/Scripts/set_ssh_env_for_cron_unison.sh
)
#!/bin/sh
SSH_ENV=$HOME/.ssh/environment_for_cron ## file to be generated
SSH_ENV2=$HOME/Documents/Scripts/unison_sync.sh ## Script 2 to be generated
function start_agent {
echo "Initialising new SSH agent..."
env | grep SSH | sed 's/SSH_AUTH_SOCK=//' > ${SSH_ENV} ## send output of env | grep SSH minus "SSH_AUTH_SOCK=" so cron can get output from SSH_ENV
## create a new script with three lines, line 3 is unison command
echo "#!/bin/sh" > ${SSH_ENV2} ## line 1
env | grep SSH >> ${SSH_ENV2} ## line 2
echo "/usr/bin/unison /home/<username>/Desktop ssh://<Host's local IP address>:<Host's listening SSH Port>//home/<username>/Desktop -batch -debug update+ -ignore 'Name *.gvfs' -ignore 'Name .cache*' -ignore 'Name [Cc]ache*' -ignore 'Name .thumbnails*' -ignore 'Name [Tt]rash*' -ignore 'Name *.backup*' -ignore 'Name *~' -ignore 'Name .dropbox*' -ignore 'Name /proc/*' -ignore 'Name /sys/*' -ignore 'Name /dev/*' -ignore 'Name /run/*' -ignore 'Name /root/Ubuntu One/*'" >> ${SSH_ENV2} ## line 3
echo succeeded
chmod 644 ${SSH_ENV} ## change permissions so cron can read SSH_ENV
chmod 775 ${SSH_ENV2} ## change permissions so cron can execute SSH_ENV2
. ${SSH_ENV} > /dev/null
ssh-add id_rsa ## unlocks your RSA key and loads it into the ssh-agent which holds keys in memory throughout login session
}
if [ -f "${SSH_ENV}" ]; then
. ${SSH_ENV} > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
编辑<username>
的 crontab 每 10 分钟执行一次同步
crontab -e
现在将以下几行添加到<username>
crontab中
SSH_AUTH_SOCK=/home/<username>/.ssh/environment_for_cron
*/10 * * * * /home/<username>/Documents/Scripts/unison_sync.sh
- 确保新的 crontab 中上面两行后面有一个空白的新行!
Ctrl使用+ x;退出,y
表示“YES”;Enter确认。检查 crontab 文件:
crontab -l
将脚本 1 设置为在启动时运行
使用Dash
> Startup Applications
(或Gnome 上的Applications
> System Tools
> Preferences
)添加新的启动程序。在“命令:”处输入:
/home/<username>/Documents/Scripts/set_ssh_env_for_cron_unison.sh
恭喜!
如果一切顺利,您将在客户端登录时输入客户端 RSA 密钥的密码,并且在整个登录会话期间您无需再次输入密码。每隔 10 分钟,客户端将自动与主机协商无密码 SSH 连接,Unison 将同步/home/<username>/Desktop
和//HOST//home/<username>/Desktop
。您的笔记本电脑和台式机现在可以同步了。
*细节:
我的最终设置是使用非标准 SSH 端口以静态 IP 与“主机”通信<username>
(不是)。“主机”上的密码验证已禁用(需要预先验证的 RSA 密钥),而“客户端”上的 RSA 密钥需要密码才能使用(每个登录会话一次)。因此,攻击者需要猜测正确的端口、RSA 密钥和密码才能像“主机”一样创建 shell。root
<username>
在每个登录会话中输入一次密码后,“客户端”和“主机”每 10 分钟自动同步一次。我发现这种方法可以使用 的<username>
RSA 密钥和cron
的环境。**
警告!当然,如果一台或两台机器都处于离线、关闭等状态,它们将不会同步!
root
**如果有更简单的方法,使用客户端的 RSA 密钥并且不需要密码,同时主机拒绝基于密码的 SSH 连接,请随时告诉我们。