2012-11-30 32 views
5

छोड़ने की अनुमति देना मैं एक सिस्टम पर प्रदर्शन परीक्षण कर रहा हूं जहां मुझे यह सुनिश्चित करने की ज़रूरत है कि मैं डिस्क से डेटा पढ़ रहा हूं, और यह केवल कैश नहीं है (पहले परीक्षणों से कहें)। मैं here पढ़ा है कि मैं कमांड के साथ कैश ड्रॉप कर सकते हैंएक गैर-रूट उपयोगकर्ता को कैश

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

हालांकि, ध्यान दें कि भले ही मेरे खाते एक व्यवस्थापक खाता (लॉग इन पीटर) है, यह अभी भी अपना पासवर्ड की आवश्यकता है। मैं पासवर्ड को इनपुट करने की आवश्यकता के बिना इसे बैच स्क्रिप्ट में चलाने में सक्षम होना चाहता हूं (क्योंकि यह स्पष्ट रूप से मैनुअल है)

अधिक research ने मुझे सूडोर्स फ़ाइल में ले जाया। मेरी योजना उपर्युक्त कमांड को ड्रॉप कैश नामक एक पंक्ति स्क्रिप्ट में रखना था, और सूडोर्स को संपादित करना ताकि मैं पासवर्ड दर्ज किए बिना इसे चला सकूं। तो मैंने लाइन

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

मेरी सूडोर्स फ़ाइल (विसुडो का उपयोग करके) के अंत में लाइन जोड़ा। मेरी व्यवस्थापक खाते के साथ, अगर मैं

sudo -l 

चलाने मैं

(ALL) NOPASSWD: /home/peter/dropCache 

मिल हालांकि, अगर मैं अपने dropCache स्क्रिप्ट चलाने मैं अभी भी अपने पासवर्ड

./dropCache 
[sudo] password for peter: 

इस के साथ किसी भी मदद के लिए पूछे जाते बहुत सराहना की जाएगी। मैं Ubuntu 12.04

धन्यवाद पीटर

उत्तर

7

मैं क्या किया था जब मैं, जरूरत इस मैं एक छोटे से सी कार्यक्रम लिखा था जड़ को संकलित फ़ाइल के मालिक बदल चला रहा हूँ, और 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

यह काम किया! धन्यवाद थॉमस - आप अपने उच्च प्रतिष्ठा स्कोर –

+0

के लायक हैं यह निष्पादन योग्य सुरक्षा जोखिम है - आप अपने पथ को सेट नहीं करते हैं और पूर्ण पथ नाम के बिना बाहरी कमांड चलाते हैं। आप बाहरी सिंक कमांड को चलाने के बजाय सिंक() सिस्टम कॉल को सीधे कॉल कर सकते हैं। –