私はPythonプログラミング入門プロセスの調教として働いています(すべての作業は端末で行われます)、プロジェクト提出スクリプトを書いています。理想的には、次のようなディレクトリ設定が必要です。
submissions/
user1/
project1/
...
user2/
project1/
...
...
理想的には、すべてのユーザーがコミットディレクトリのすべての内容を読み書きできるようにし、すべての操作を正しい場所にコピーするコミットスクリプトを提供します。
現在のサブミットを実行して使用するときに動作する小さなPerlスクリプトがありますが、生徒がスクリプトを実行したときにエラーが発生しないように権限(またはスクリプト)を設定するには(サブミットディレクトリへpermission denied
の書き込み権限が必要です)が、書き込み権限もありますありませんか?
答え1
完全性のために、これが最も簡単な解決策です。私はバージョン管理システムがなぜ不適切なのかという私の視点に従います。
私は提出された実行可能ファイルでsetuidビット(chmod 4755)を有効にして、学生がそれを実行したときにプログラムが私と同じように実行するようにしました。すべてのファイルをコピーすると、所有権が私に転送され、生徒がディレクトリ全体にアクセスできないようにすることができます。これには、Perlによって追加されたsetuidセキュリティのいくつかの障害(汚染入力なし、汚染PATHなし)を克服することが含まれていましたが、最終的にはうまくいきました。最終スクリプトの長さは約20行でした。
バージョン管理システムが許可されない理由は、これがプログラミングの最初のプロセスであるためです。学生はターミナルを使ったことがなく、SSH経由でサーバーに接続し、ファイルを送受信するという考えに非常に混乱していました。バージョン管理システムの詳細は、上位クラスのクラスに適しています(特に学生が端末のスペルエラーに脆弱な場合!)。今日、このコースの中で、実際にバージョン管理システムの学習が必要なコースがどれだけ多いかを知れば驚きます(私は学部の時に4つのコースを受講しました)。バージョン管理システムを設定できない重要性の低い理由は、サーバーに対するスーパーユーザー権限を持っておらず、バージョン管理システムを把握できないという理由だけで、教授にバージョン管理システムの設定を要求しないからです。愚かなsetuidビット。
この過程で私が望んだのは、プライベートポジションに簡単な1段階の提出だけでした。問題は私のソリューションの構造ではなく、私の実装とUnix権限の知識の欠如(setuidビットを知らない)にあります。したがって、Sean C.のコメントはヒントでしたが、最初はスクリプトをrootとして実行したいと思っていました。
これは実際の作業スクリプトとその権限です。あなたが発見したセキュリティの脆弱性を表示してください。
-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
コメントの1つに対するフォローアップ(まだコメントするのに十分な能力がありません):誰もが自分の仕事を完了するために既知のホストへのシェルアクセスを持っているようです。これは仕事を簡単にします。あなたがすることができなければならないことは次のとおりです。
- 各学生のためにgitサーバー(このタイプの環境ではgitoliteが望ましい)とは別のリポジトリを設定する必要があります。生徒のホームディレクトリが設定されていると仮定すると、生徒のアカウントごとにssh-keygenを実行し、公開鍵をgitolite管理設定にコピーできます。(編集(説明):gitoliteをインストールするにはrootアクセスは必要ありません。もちろん、学生の公開/秘密鍵を作成するにはそのアカウントにアクセスする必要がありますが、これは必要に応じて自分で実行できるコマンド(ssh-keygen)だけです。 )
- すべての学生ただ次の権限があります。彼らリポジトリですが、すべて読み書きできます。
- コースの開始時に初期テンプレートと指示を使用してリポジトリを複製し、新しい課題と提出物をインポートまたはプッシュするだけです。
- 各プロジェクト(作業)は、提案どおりに別々のディレクトリに配置できます。ディレクトリを直接作成し、変更をコミット/プッシュすることができ、プロジェクトを起動するときに変更を簡単にドラッグできます。 (はい、各生徒に対してこれを行う必要がありますが、スクリプトで簡単に作成できます。)これにより、自動採点をサポートするためにプロジェクトディレクトリの名前がすべて正しく指定されていることがわかります。
- ボーナス:締め切りの前日の夜に誰がプロジェクトを開始したのか、誰が早く始めて進行中に改善したのかを確認できます。安定した献身のためのボーナスポイント、「完了した」プロジェクトへの個々のコミットのためのマイナスポイント。また、(オプションで)人々がチームで作業するようにすることもできます。本物誰がすべてを行ったかを確認してください。 (誰もが自分自身のコミット履歴を持っています。)gitoliteでこのように権限を設定するのは簡単です。
簡単に言えば、学生は学ぶことが多く、教える時間がほとんどありません。過去20年間、専門開発者として実際に使用方法を知っている新入社員が大学を卒業したことはほとんど見たことがありません。どのバージョン管理タイプです。彼らはプログラミング言語x、y、z(およびJava)の知識が不足しており、ソフトウェア開発については全く知りません。しかし、学生を非難することはできませんか? (エヘム…)これは教える瞬間です。
答え3
あなたは利用可能でなければなりません粘り強いビット生徒が共有ディレクトリ内の自分のファイルのみを上書きできるようにします。
編集:生徒が他の生徒の仕事を読むことができるため、問題は解決されません。