2012-11-30 10 views
5

디스크에서 데이터를 읽어야하는 시스템에서 성능 테스트를 수행하고 있으며 캐시되지 않은 것입니다 (이전 테스트에서 말한 것). 나는,root가 아닌 사용자가 캐시를 삭제할 수 있도록 허용

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

그러나 명령으로 캐시를 떨어 내 계정이 관리자 계정을 (피터 로그인)에도 불구하고, 여전히 비밀번호가 있어야한다는 사실을 명심해야 할 수 here를 참조하십시오. 암호를 입력 할 필요없이 배치 스크립트에서이 스크립트를 실행할 수 있기를 원합니다. (분명히 수동이므로)

기타 research은 sudoers 파일로 안내합니다. 내 계획은 위의 명령을 dropCache라는 한 줄 스크립트에 넣고 sudoers를 편집하여 암호를 입력하지 않고 실행할 수 있도록하는 것이 었습니다. 그래서 (visudo를 사용) 내의 sudoers 파일의 끝에 선

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

을 추가했다. 내가

sudo -l 

을 실행하면 내 관리자 계정으로, 나는 내 dropCache 스크립트를 실행하면 난 아직도 내 비밀번호

./dropCache 
[sudo] password for peter: 

이 가진 모든 도움을 요청받을 그러나

(ALL) NOPASSWD: /home/peter/dropCache 

를 얻을 수 많이 감사하겠습니다. 나는

내가,이 내가 작은 C 프로그램을 작성 하였다 필요한 루트로 컴파일 된 파일의 소유자를 변경할 때 내가 무슨 짓을 감사 피터

답변

7

우분투 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 명령을 실행하는 대신 sync() 시스템 호출을 직접 호출 할 수 있습니다. –

관련 문제