Para completar, aqui está a solução mais simples. Eu a sigo com a minha visão de por que um sistema de versionamento não é apropriado.
Acabei habilitando o bit setuid no executável de envio (chmod 4755), de modo que, quando os alunos o executavam, o programa funcionava como eu. Todas as cópias de arquivos transfeririam a propriedade para mim e eu poderia tornar o diretório inteiro inacessível para os alunos. Isso envolveu alguns obstáculos para ultrapassar a segurança adicional do Perl (não conseguir a entrada, não melhorar o PATH), mas funcionou muito bem no final. O roteiro final é de cerca de 20 linhas.
A razão pela qual um sistema de versionamento é inaceitável é porque este é um primeiro curso em programação. Os alunos nunca usaram um terminal e estão confusos o suficiente com a idéia de fazer ssh em um servidor e transferir arquivos para frente e para trás. Os detalhes de um sistema de controle de versão são para classes de divisão superior (especialmente quando um aluno é propenso a erros de terminal!). E você ficaria surpreso hoje em saber quantos desses cursos realmente requerem um para aprender um sistema de controle de versão (eu fiz quatro cursos que fiz na minha graduação). Uma razão menos significativa que eu não poderia fazer um sistema de versionamento é que eu não poderia ter privilégios de superusuário no servidor, e não pediria ao professor que configurasse um sistema de versionamento só porque eu não conseguia descobrir o estúpido bit setuid.
Tudo o que eu quero para este curso é um simples envio de uma etapa para um lugar particular. O problema foi com a minha execução e falta de conhecimento sobre as permissões unix (não sabendo sobre o bit setuid), não a estrutura da minha solução. Então o comentário de Sean C. foi a dica, mas eu não o reconheci no começo porque parecia que ele queria dizer que o objetivo era executar o roteiro como root, e eu não queria que isso protegesse o mundo do meu próprio ingenuidade sobre o unix.
Aqui está o script de trabalho real e suas permissões. Por favor, indique quaisquer falhas de segurança que você possa ver.
-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";
}