2012-11-30 19 views
5

私はディスクからデータを読み込み、キャッシュされていないことを確認する必要のあるシステムでパフォーマンステストを行っています。私はhereを読んで、私はしかしコマンドでroot以外のユーザーがキャッシュを削除できるようにする

echo 3 | sudo tee /proc/sys/vm/drop_caches 

をキャッシュをドロップすることができる、私のアカウントが管理者アカウント(ピーター・ログイン)であっても、それはまだ私のパスワードを必要とすることに注意してください。パスワードを入力する必要なしにバッチスクリプトでこれを実行できるようにしたい(これは明らかに手動です)

さらにresearchはsudoersファイルに導かれました。私の計画は、上記のコマンドをdropCacheという1行のスクリプトに置き、sudoersを編集してパスワードを入力せずに実行できるようにすることでした。だから、私のsudoersファイルの最後にvisudoを使って

ALL ALL=(ALL)NOPASSWD:/home/peter/dropCache 

を追加しました。私は

sudo -l 

を実行する場合、私の管理者アカウントを使用すると、私は私が私のdropCacheスクリプトを実行する場合、私はまだ私のパスワード

./dropCache 
[sudo] password for peter: 

これで任意の助けを求めます、しかし

(ALL) NOPASSWD: /home/peter/dropCache 

を取得します非常に高く評価されるだろう。私は

私は、これは私は小さなCプログラムを書いた必要なルートにコンパイルされたファイルの所有者を変更したときに、私が何をしたかのおかげ ピーター

答えて

7

のUbuntu 12.04を実行している、とsetuidビットを設定しています。 - クール - 私はそれを試してみると、あなたに戻って取得してみましょう

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 

extern void sync(void); 

int main(void) { 
    if (geteuid() != 0) { 
     fprintf(stderr, "flush-cache: Not root\n"); 
     exit(EXIT_FAILURE); 
    } 
    printf("Flushing page cache, dentries and inodes...\n"); 
    // First: the traditional three sync calls. Perhaps not needed? 
    // For security reasons, system("sync") is not a good idea. 
    sync(); 
    sync(); 
    sync(); 
    FILE* f; 
    f = fopen("/proc/sys/vm/drop_caches", "w"); 
    if (f == NULL) { 
     fprintf(stderr, "flush-cache: Couldn't open /proc/sys/vm/drop_caches\n"); 
     exit(EXIT_FAILURE); 
    } 
    if (fprintf(f, "3\n") != 2) { 
     fprintf(stderr, "flush-cache: Couldn't write 3 to /proc/sys/vm/drop_caches\n"); 
     exit(EXIT_FAILURE); 
    } 
    fclose(f); 
    printf("Done flushing.\n"); 

    return 0; 
} 
+0

こんにちはトーマス:ここ

ソースコードです! –

+1

それはうまくいった!ありがとうThomas - あなたは高い評判スコアに値する –

+0

この実行ファイルはセキュリティ上のリスクです.PATHを設定せず、絶対パス名なしで外部コマンドを実行してください。外部同期コマンドを実行する代わりに、sync()システムコールを直接呼び出すことができます。 –

関連する問題