2012-11-30 8 views
5

Tôi đang thực hiện các kiểm tra hiệu suất trên một hệ thống mà tôi cần đảm bảo rằng tôi đang đọc dữ liệu từ đĩa và không phải chỉ được lưu trong bộ nhớ cache (nói từ các bài kiểm tra trước đó). Tôi đọc here mà tôi có thể thả bộ nhớ cache bằng lệnhCho phép người dùng không phải root để xóa bộ nhớ cache

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

Tuy nhiên, lưu ý rằng mặc dù tài khoản của tôi là tài khoản quản trị (đăng nhập peter), nó vẫn đòi hỏi mật khẩu của tôi. Tôi muốn có thể chạy điều này trong tập lệnh theo lô mà không cần nhập mật khẩu (vì đây rõ ràng là thủ công)

Thêm research dẫn tôi đến tệp sudoers. Kế hoạch của tôi là đặt lệnh trên vào một dòng lệnh có tên là dropCache và chỉnh sửa sudoers để tôi có thể chạy nó mà không cần nhập mật khẩu. Vì vậy, tôi đã thêm dòng

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

vào cuối tệp sudoers của tôi (sử dụng visudo). Với tài khoản quản trị của tôi, nếu tôi chạy

sudo -l 

tôi nhận được

(ALL) NOPASSWD: /home/peter/dropCache 

Tuy nhiên, nếu tôi chạy script dropCache của tôi, tôi vẫn nhận được yêu cầu nhập mật khẩu của tôi

./dropCache 
[sudo] password for peter: 

Bất kỳ sự giúp đỡ với điều này sẽ được nhiều đánh giá cao. Tôi đang chạy Ubuntu 12.04

Cảm ơn Peter

Trả lời

7

Những gì tôi đã làm khi tôi cần thiết này là tôi đã viết một chương trình C nhỏ, thay đổi chủ sở hữu của các tập tin được biên soạn để root, và thiết lập các bit setuid.

Đây là mã nguồn:

#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

Hi Thomas - mát - hãy để tôi cung cấp cho nó một thử và lấy lại cho bạn! –

+1

Đã hoạt động! Cảm ơn Thomas - bạn xứng đáng với điểm số danh tiếng cao của bạn –

+0

Điều này thực thi là một nguy cơ bảo mật - bạn không đặt PATH của bạn và chạy một lệnh bên ngoài mà không có một tên đường dẫn tuyệt đối. Bạn chỉ có thể gọi hệ thống sync() gọi trực tiếp thay vì chạy lệnh đồng bộ bên ngoài. –