因此,我正在尝试编写一个脚本来使用 ssh 文件服务器备份一些各种配置文件,但我不确定执行此操作的最佳方法。如果我可以用两台机器的绝对文件路径填充一个文件并直接使用并行或其他方式执行此操作,那就太好了。Parallel 有一个适用于单个目录的脚本,但我想将其扩展到多个位置。
例如:
/home/$USER/.bashrc --> remoteuser@remoteIP:/home/remoteuser/backup/.bashrc
/home/$USER/.config/i3/config --> remoteuser@remoteIP:/home/remoteuser/backup/.config/i3/config
对于大量文件,如果服务器实际上有更新的副本,则反方向进行。
remoteuser@remoteIP:/home/remoteuser/backup/.bashrc --> /home/$USER/.bashrc
我可以使用这两个命令有效地对一个文件执行此操作,但我必须登录两次。
rsync -vrut -e 'ssh -p portnumber' /home/$USER/.bashrc remoteuser@remoteIP:/home/remoteuser/backup/.bashrc
rsync -vrut -e 'ssh -p portnumber' remoteuser@remoteIP:/home/remoteuser/backup/.bashrc /home/$USER/.bashrc
答案1
对于第一种情况,rsync 非常乐意接受多个源操作数并且-R
/选项--relative
将保留它们的路径, 所以
rsync -R backup/.bashrc backup/.config/i3/config dest:/home/remoteuser
应该帮你解决。--no-implied-dirs
当您有更复杂的结构时,可以使用该选项来跳过共享路径。
-R, --relative use relative path names --no-implied-dirs don't send implied dirs with --relative
对于相反的方向,您可以对多个远程源执行相同的操作,并且 rsync 应该足够聪明,不会与同一服务器建立单独的连接。
有时,如果您经常这样做来创建一个充满符号链接的虚假目录结构,其中仅包含您想要的文件,并使用 -L 选项和单个源,那么有时会更容易。
另一方面,它是总是定向:您不能使用单个命令使双方都拥有最新版本,因此需要两个命令。您可以使用共享的 SSH 控制套接字通过同一 SSH 连接运行它们,这样就只有一个实际登录 - 请参阅ControlMaster
ssh 配置文档中的其他登录。