2

クラスで使用する出席プログラムを Java で作成しています。私の目標は、生徒が自分のアカウントにクラス ファイルをダウンロードし (同じネットワーク上で作業します)、毎日変更されるユーザー名とパスワードでそれらを実行できるようにすることです。プログラムは正常に動作しますが、解決できないバグに遭遇しました。

特定の日に初めて実行されると、attend.java はアカウントの指定されたディレクトリに新しいテキスト ファイルを作成しプログラムを実行したユーザーのユーザー名をファイルに追加します (現在は、最初の引数を追加するだけです)。プログラムをファイルに追加しますが、より正確になり、誰も偽のユーザー名を付けられないように修正したいと考えています)。これにより、学生のリストを作成します。

たとえば、次のように実行します。

>> java attend desadams cheesecake

指定されたパスワード「cheesecake」を取得し、それがその日のパスワードと一致する場合は、「(今日の日付).txt」という名前の新しいテキストファイルを作成し、ユーザー名「desadams」をそれに書き込みます (その日に初めて実行される場合) ) または、既存の「(今日の日付).txt」ファイルにユーザー名「desadams」を追加するだけです。

java.nio.file パッケージを利用してカスタム権限を持つファイルを作成する独自の createFile() メソッドを作成しました。

  public static void createFile(File file) throws IOException{
    Path newFile = file.toPath();

    //create new file and set permissions
    /* For the purposes of this program, the new file (the attendance list) must readable and writable to everbody
     * in order for this program to work properly when run from their user, because this program both reads and modif\
ies.
     */
    Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrw-rw-");
    Files.createFile(newFile);
    Files.setPosixFilePermissions(newFile, perms);

    //set owner
    UserPrincipal owner = newFile.getFileSystem().getUserPrincipalLookupService().lookupPrincipalByName("desadams");
    Files.setOwner(newFile, owner);

    //set group
    GroupPrincipal group = newFile.getFileSystem().getUserPrincipalLookupService().lookupPrincipalByGroupName("studen\
ts");
    Files.getFileAttributeView(newFile, PosixFileAttributeView.class).setGroup(group);
  }

アカウントのumaskが邪魔になるので、ファイルの作成とパーミッションの設定を同時に行うことができなかったので、2ステップで行いましたが、うまくいきました。

ここで問題に取り掛かります。このプログラムを自分のアカウントから問題なくコンパイルして実行できますが、他のアカウントから実行することを想定して、 setOwner() メソッドを変更し、自分のユーザー名ではなく任意のユーザー名を使用して、より適切にシミュレートしました。別のアカウントからプログラムを実行する条件。そして、それは失敗しました。所有者をプログラムの実行者以外に設定しようとすると、「操作は許可されていません」というエラーが発生します。

どのネットワーク アカウントもルート アカウントにアクセスできないため、UNIX コマンドのchownが機能しないことはすでにわかっていましたが、Java が同じことを行うのを妨げるとは思っていませんでした。

とにかくこれを回避する方法はありますか?もちろん、最も簡単な方法は、毎日誰よりも先に自分でプログラムを実行することです。これにより、出席ファイルが自分のユーザー名で作成され、所有者を自分のユーザー名に設定することを心配する必要がなくなります。プログラム自体のユーザー名; 出席ファイルは常に検索されるため、適切なファイル属性で作成する必要はありません。ただし、それはまさに私がしていることかもしれませんが、プログラム自体に所有者を設定する方法を提案する解決策があるかどうか知りたいです。

ありがとう、申し訳ありませんが、これは長い投稿でした。

4

1 に答える 1

0

ユーザーがシステムのsudoerである場合は、ユーザーにsudoを実行させることができますsudo java attend desadams cheesecake。ただし、sudoerではないことを期待しているため、最初にファイルを作成するソリューションがおそらく最良のソリューションです。

于 2012-11-04T05:54:17.910 に答える