1

cp ユーティリティを模倣するプログラムを作成しています。ただし、ファイルのアクセス許可を正しく機能させることができません。statそれらが構造体に格納され、st_modeフィールドに格納されていることを知っていstatます。

私の問題は、グループまたは他のカテゴリの書き込み権限を取得していないことです。つまり-rwxr-xr-x、ソース ファイルが-rwxrwxrwx. パーミッションを設定したステートメントは以下のとおりです。

if ( (dest_fd = open(dest_file, O_WRONLY|O_CREAT, (stats.st_mode & S_IRUSR)|(stats.st_mode & S_IWUSR)|(stats.st_mode & S_IXUSR)|(stats.st_mode & S_IRGRP)|(stats.st_mode & S_IWGRP)|(stats.st_mode & S_IXGRP)|(stats.st_mode & S_IROTH)|(stats.st_mode & S_IWOTH)| (stats.st_mode & S_IXOTH))) < 0)
    {
            printf("There was a problem opening the destination file.");
            exit(EXIT_FAILURE);
    }//ends the if statement opening the destination file.
4

4 に答える 4

4

これまでのところ、問題は正しいですが、 (プログラムがマルチスレッドである場合、またはファイルを作成するライブラリ関数を呼び出す可能性がある場合、これは危険です)をumaskクリアするのではなく、ユーザー構成変数として扱います。変更は許可されていません。代わりに、ファイルを作成した後でファイルを呼び出して、必要な最終的なアクセス許可を付与してください。これは、ファイルが変更されるたびに一部のカーネルが削除するsuid/sgidなどの特定のアクセス許可を与えるためにとにかく必要になる場合があります。また、最初にモードを使用してファイルを作成します。これにより、ファイルを開いてから、別のユーザーがファイルのハンドルを開くことができるアクセス許可を変更するまでの間に競合状態が発生しなくなります。umaskumaskfchmod0600

于 2012-09-12T15:17:00.117 に答える
3

問題の原因は

作成したファイルのパーミッションは(mode & ~umask)

通常、umask022であるため、誰でも書き込み可能なファイルの作成を禁止します。

于 2012-09-12T15:13:03.503 に答える
1

syscall を使用してchmod(2)、既存のファイルまたはディレクトリのアクセス許可を変更したりfchmod(2)、開いているファイル記述子を指定してアクセス許可を設定したりできます。

安全性を高め、競合状態の悪用を防ぐために、ファイルの作成中に非常に制限されたアクセス許可のセットを使用chmod(2)してから、元のアクセス許可を復元するために使用できます。これは何をするかcp -aです (デフォルトのパーミッションでファイルを作成することを除いて):

$ strace cp -a file file1
...
open("file1", O_WRONLY|O_TRUNC)       = 4
...
fchmod(4, 0100640)                    = 0
...

chmod(2)umask の値の影響をfchmod(2)受けません。

于 2012-09-12T15:23:43.443 に答える
1

*nix は、作成したファイルのモード ビットをマスクしますが、umask()関数を使用してマスクを変更できます。man umask(おそらくman 2 umask)詳細については。

于 2012-09-12T15:13:06.717 に答える