Background
When you work with a team and upload files in the download area, you want to use appropriate permissions so that other members of your team can also make change.
Savannah is specially configured for this task: the download areas carry
the 'setgid' bit (chmod g+s
) so that newly created directories belong
to your project group. Moreover, the default umask for all SSH sessions
is 002, which means members of your group will have write access to the
files and directories you create.
Unfortunately, tools like scp
and sftp
do not always respect this:
- new files sent via scp get the original file's permissions (sr #105830)
- sftp breaks the setgid bit (chmod's mode is AND'd
0777
) (sr #105838 )
How to set permissions
First, vote for this sftp bug:)
The simplest way is to correctly chmod your files before upload:
- mode
664
(orug=rw,o=r
) for files - mode
2755
(ug=rwx,g+s,o=rx
) for directories
Always remember to give group write access, so other members of your
team can also manage the download area. Make sure the group is your
project, not svusers
, otherwise all Savannah members can alter your
files.
One simple way to manage the download area is to maintain a local copy on your computer, synchronize it using rsync:
local$ cd /tmp
local$ mkdir -m 2775 mydir
local$ scp -rp mydir me@dl.sv.gnu.org:/releases/myproject/
# or
local$ rsync -a mydir/ me@dl.sv.gnu.org:/releases/myproject/mydir/
# or (shorter)
local$ rsync -a mydir me@dl.sv.gnu.org:/releases/myproject/
How to fix permissions for existing files
Eric Noulard suggested the following procedure for fixing directories, by downloading the whole download area, and uploading only the fixed directories:
mkdir myproject_da
scp -r erk@dl.sv.nongnu.org:/releases/myproject myproject_da
# myproject_da contains 'myproject/'
mkdir myproject_dironly
cd myproject/
find . -type d -exec mkdir ../myproject_dironly/{} \;
cd myproject_dironly/
chmod -R g+ws .
scp -rp myproject erk@dl.sv.nongnu.org:/releases/
This doesn't fix the directories group though.
To change a file group, you need to use the numerical id. Example, to change 'administration' to 'savane-cleanup':
sftp> ls -l
-rw-r--r-- 1 Beuc administration 6497801 Jun 24 18:14 savane-3.1-zeta.tar.gz
drwxrwsr-x 2 Beuc savane-cleanup 4096 Jun 25 08:53 test-install
sftp> ls -ln
-rw-r--r-- 0 68632 5038 6497801 Jun 24 20:14 savane-3.1-zeta.tar.gz
drwxrwsr-x 0 68632 6870 4096 Jun 25 10:53 test-install
sftp> chgrp savane-cleanup savane-3.1-zeta.tar.gz
You must supply a numeric argument to the chgrp command.
sftp> chgrp 6870 savane-3.1-zeta.tar.gz
Changing group on /srv/download/savane-cleanup/savane-3.1-zeta.tar.gz
sftp> ls -l
-rw-r--r-- 1 Beuc savane-cleanup 6497801 Jun 24 18:14 savane-3.1-zeta.tar.gz
drwxrwsr-x 2 Beuc savane-cleanup 4096 Jun 25 08:53 test-install