如何在Dropbox中保留所有权和权限?


9

我有两台计算机,一台Mac和一台运行Linux的PC,我试图使某些文件在使用Dropbox之间保持同步。

我正在同步的文件之一需要自己以外的其他用户(在同一台计算机上的不同UID,而不是指另一个保管箱用户)写入。更具体地说,另一个UID实际上是一个守护程序。因此,该文件需要由该其他用户拥有,或者“组”和/或“其他”需要写许可。最初,我在两台计算机上都采用这种方式进行设置。另外,包含文件的目录已由需要对该文件具有写访问权的用户拥有(chmod 777)。

但是,每当文件从一个框同步到另一个框时,Dropbox便会完全忽略这两组权限,并将新更新的文件的权限更改为我拥有的权限0644(对我来说是rw,对于其他人来说是r )。如果该文件不属于我,它甚至会将所有权更改回我自己!结果,其他用户不再具有写权限,直到我手动进入并重新chmod文件为止。

我尝试过的其他无效的东西:

  1. 确保两台计算机上的用户帐户(“其他用户”)具有相同的UID。不确定为什么这是必要的,因为我的主帐户在两台计算机上都没有相同的UID。

  2. chmod u+s <dir>以及chmod g+s <dir>包含相关文件的目录在哪里。

  3. 将文件的所有权更改为其他用户,并将其放置在Dropbox目录的外部,并在Dropbox目录中创建指向该文件的符号链接。Dropbox实际上删除了符号链接,使原始文件(在Dropbox目录之外)保持不变,并在以前的符号链接的位置创建了文件的新副本!

如何设置内容,以便保留我的权限和/或所有权?

Answers:


5

好的,这是我找到的解决方案。尚不确定这是否适用于Dropbox的未来版本。我已通过Dropbox打开服务请求,以尝试进一步解决问题。

总体而言,该解决方案是两件事的结合:

  1. 为Dropbox进程设置umask,以使新创建的文件具有0660的权限。这是用户读/写,组读/写,其他权限。
  2. 将新创建文件的组设置为需要对该文件具有写访问权的组。

此解决方案将应用于Dropbox文件夹中的所有文件,而不仅仅是单个文件。就我而言,这是可以接受的。

在Linux下,我修改了/etc/init.d/dropbox启动脚本,以便将作为守护程序的dropbox调用行读取为:

HOME="$HOMEDIR" start-stop-daemon --umask 0006 -b -o -c $dbuser:$dbgrp -S -u $dbuser -x $HOMEDIR/$DAEMON

添加--umask 0006完成即可完成对umask的设置,而:$dbgrp-c选项的一部分可以完成将组设置为该守护程序所属的组。

在Mac端,我运行以下命令:

ps aux | grep -i dropbox

从中我可以看到启动Dropbox的命令行选项,并从中提取以后使用的$ mydropboxid。然后,我退出Dropbox并打开命令提示符,然后输入以下命令:

umask 0006
/Applications/Dropbox.app/Contents/MacOS/Dropbox -psn_0_$mydropboxid &
exit

我计划在某个时候使上述命令自动化,这样我的计算机重新启动时就不必重新运行这些命令。

这将为新创建的文件设置掩码,以便文件组具有写访问权限。然而,为了正确设置组,我需要设置Dropbox缓存目录-到目前为止,只需要执行一次:

sudo chgrp -R $dbgrp ~/Dropbox/.dropbox.cache
sudo chmod -R g+s ~/Dropbox/.dropbox.cache

似乎所有新文件都是首先在〜/ Dropbox / .dropbox.cache目录下创建的,因此上述命令为这些新文件赋予了适当的所有权和权限,以确保Dropbox创建的新文件具有正确的组。


有趣。您能否再解释一下此行和修改后的文件的一般含义?
nixda

start-stop-daemon是一个Linux实用程序,可让您控制运行守护程序的各种设置。大多数参数都在shell变量中传递。关键的修改是添加了“ --umask 0006”,它保留了对用户和组的R / W权限,但对其他用户和组却保留了该权限,并且在-c参数中添加了组参数(“:$ dbgrp”),设置守护进程运行的UID / GID)。Mac命令与此类似,但是我没有找到类似的实用程序,因此依赖于在运行Dropbox的外壳中设置这些设置。
迈克尔

这是否也适用于当前的保管箱版本?我的保管箱脚本PAR=$(dirname $(readlink -f $0)) OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH LD_LIBRARY_PATH=$PAR${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH exec $PAR/dropbox $@位于./.dropbox-dist/中,并通过提供的python脚本进行管理
自行车

@bicycle自提出此解决方案以来,没有提示我更新我的保管箱客户端。
迈克尔

@ Michael,Dropbox曾经回应您的服务请求吗?
bbozo

0

将该文件放在其自己的文件夹中,然后与其他用户共享该文件夹。这样,他们像您一样编辑最新版本。注意不要同时进行操作。


1
更新我的原始问题,以反映包含相关文件的文件夹已经由其他用户拥有的事实。没关系,Dropbox仍然会忽略当前的所有权/权限,并在文件同步到计算机时重置它们。
迈克尔

0

如果您在两台计算机之间复制文件,则执行复制的软件将确定副本上的权限。对于您正在执行的操作,您需要一些相当精细的权限映射。如果两个系统都运行相同的OS,则 Dropbox权限映射功能仅限于保留权限。在两个不同的操作系统之间进行复制时,无法保证获得特定的结果。

即使您能找到某种以所需方式使用Dropbox的方法,也建议您不要依赖它。未记录的软件怪癖有一种消失的方式,恕不另行通知。您需要考虑针对您的用例而设计的文件传输工具。我的第一个选择是rsync,它是Linux发行版中的标准配置,并且易于在Windows上安装,特别是如果您使用Cygwin时。Cygwin通常对于必须同时使用Windows和Linux的人很有用!

当然,rsync需要直接连接-没有像Dropbox那样的中央服务器。如何处理取决于网络设置的详细信息。


是的,我同意您所说的怪癖。在我看来,这通常是停止升级软件的一个很好的理由-如果它能够满足您的要求,为什么还要冒险使用较新的版本来破坏软件!
迈克尔,

rsync不是双向的,并且不会在每次更改文件时自动更新。
迈克尔,

@Michael您并非总是可以选择升级软件。当它的基于云(如Dropbox的),你永远不会有一个选择。很难理解为什么双向或自动复制对于您要执行的操作必不可少。
艾萨克·拉比诺维奇

只要该服务与先前的客户端保持向后兼容,您就可以选择。而且,除非Dropbox可以强迫所有人立即进行升级,否则我怀疑他们会采取诸如对协议进行低级更改(这会破坏旧客户端)的方式。我看到他们可以做到的唯一方法是通过某种过渡。
迈克尔,

关于我要执行的操作,我正在尝试在两台不同的计算机上维护一组文件,并能够在任何给定时间修改其中一个文件,然后不久后跳转到另一个文件并进行提取我离开的地方,而不必像启动rsync那样手动执行任何操作。这主要是因为我可能会远程进行修改(例如,通过Web界面进行修改),并且存在防火墙和延迟等问题,这使得维护数据的单个集中副本非常不便。
迈克尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.