我是 Python 编程入门课程的助教(所有工作都是从终端完成的),我正在编写一个项目提交脚本。理想情况下,我想要这样的目录设置:
submissions/
user1/
project1/
...
user2/
project1/
...
...
理想情况下,我希望提交目录中的任何内容都对任何用户可读或可写,并且我将提供一个提交脚本,将他们的所有工作复制到正确的位置。
目前我有一个小的 Perl 脚本,它执行提交部分并在使用它时工作,但是如何设置权限(或脚本)以便学生permission denied
在运行脚本时不会出现错误(需要写入权限)到提交目录),但他们不同时拥有写入权限?
答案1
为了完整起见,这是最简单的解决方案。我按照我的观点来理解为什么版本控制系统不合适。
我最终在提交的可执行文件上启用了 setuid 位(chmod 4755),这样当学生运行它时,程序就会像我一样运行。所有文件的复制都会将所有权转移给我,并且我可以使学生无法访问整个目录。这确实涉及到克服 Perl 添加的 setuid 安全性的一些障碍(不污染输入、不污染 PATH),但最终效果很好。最终的剧本大约有20行。
版本控制系统不可接受的原因是这是编程的第一门课程。学生们从未使用过终端,并且对通过 ssh 连接到服务器并来回传输文件的想法感到非常困惑。版本控制系统的细节适用于高年级班级(特别是当学生容易出现终端拼写错误时!)。今天你会惊讶地发现,其中有多少课程实际上需要学习版本控制系统(我在本科时选修了四门课程)。我无法建立版本控制系统的一个不太重要的原因是我无法在服务器上拥有超级用户权限,并且不会仅仅因为我无法弄清楚愚蠢的事情就要求教授建立版本控制系统setuid 位。
我对本课程的全部要求只是简单地一步提交到私人场所。问题在于我的执行和缺乏有关 unix 权限的知识(不知道 setuid 位),而不是我的解决方案的结构。所以 Sean C. 的评论是提示,但我一开始并没有意识到它,因为他的意思似乎是以 root 身份运行脚本,而我不希望这样来保护世界免受我自己的侵害对unix的天真。
这是实际的工作脚本及其权限。请指出您可能发现的任何安全漏洞。
-rwsr-xr-x 1 260s12ta 260s12ta 600 2012-01-16 23:19 submit
#!/usr/bin/perl
use File::Copy;
$ENV{"PATH"} = "/usr/bin"; # appease the perl-suid security for shell calls
my $username = getlogin() or die "Couldn't access user login: $!\n";
my $dir = "/home/260s12ta/labs/$username/";
foreach (@ARGV) {
if ($_ =~ /([\w-]+\.tar\.gz)/) { # untaint the given filename
$filename = $1;
} else {
die "\nInvalid submission: $_ is not a .tar.gz file.\n";
}
print "Submitting $filename... ";
copy($filename, $dir) or print "Submission failed: $!\n";
chmod(0600, "$dir/$filename") or print "Submission failed: $!\n";
print "OK!\n";
}
答案2
其中一条评论的后续内容(我还没有足够的魔力来评论):似乎每个人都可以通过 shell 访问已知主机来完成他们的任务。这样事情就简单了。以下是您可以(并且应该)执行的操作:
- 您应该为每个学生设置一个 git 服务器(对于这种类型的环境最好是 gitolite)和一个单独的存储库。假设您已经设置了学生主目录,您可以继续为每个学生帐户运行 ssh-keygen 并将公钥复制到您的 gitolite 管理配置中。(编辑(澄清):安装 gitolite 不需要 root 访问权限。当然,创建学生公钥/私钥需要访问他们的帐户,但这只是他们可以在必要时自行运行的一个命令(ssh-keygen)。 )
- 每个学生仅有的拥有以下权限他们的存储库,但您可以读取/写入所有这些内容。
- 他们在课程开始时克隆带有任何初始模板和说明的存储库;之后,他们只是拉/推新的作业和提交。
- 每个项目(作业)可以位于单独的目录中(如您建议的那样)。您可以自己创建目录并提交/推送更改,并且他们可以在启动项目时简单地提取更改。 (是的,您必须为每个学生执行此操作,但这可以轻松编写脚本。)这样您就知道项目目录都已正确命名以支持自动化评分。
- 额外的福利:您可以看到谁在截止日期前一天晚上开始了该项目......以及谁提前开始并在进行过程中进行了改进。稳定承诺的奖励积分;对于“已完成”项目的单个提交减分。您还可以(可选)让人们在团队中工作,并且真的查看谁完成了所有工作(每个人都有自己的提交历史记录。)在 gitolite 中以这种方式配置权限很简单。
长话短说:学生要学的东西太多,但教的时间却很少。在过去 20 年里,作为一名专业开发人员,我很少看到大学毕业的新员工真正懂得如何使用任何版本控制的类型。他们只是对编程语言 x、y 和 z(以及 Java)缺乏了解,对软件开发一无所知。但我们不能真的责怪学生,不是吗? (咳咳……)这是一个教学时刻。
答案3
您应该能够使用粘性位允许学生仅覆盖共享目录中自己的文件。
编辑:不能解决问题,因为学生可以阅读其他学生的作业。