Pregunta Permitir que un usuario no root omita el caché


Estoy llevando a cabo pruebas de rendimiento en un sistema en el que debo asegurarme de que estoy leyendo datos del disco y que no están simplemente en la memoria caché (por ejemplo, en pruebas anteriores). Yo leo aquí que puedo soltar caché con el comando

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

Sin embargo, tenga en cuenta que aunque mi cuenta es una cuenta de administrador (inicio de sesión peter), todavía requiere mi contraseña. Quiero poder ejecutar esto en un script por lotes sin el requisito de ingresar una contraseña (ya que obviamente es manual)

Más investigación me llevó al archivo sudoers. Mi plan era colocar el comando anterior en un script de una sola línea llamado dropCache, y editar sudoers para poder ejecutarlo sin ingresar una contraseña. Entonces agregué la línea

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

al final de mi archivo sudoers (usando visudo). Con mi cuenta de administrador, si ejecuto

sudo -l 

yo obtengo

(ALL) NOPASSWD: /home/peter/dropCache

Sin embargo, si ejecuto mi script dropCache todavía me piden mi contraseña

./dropCache
[sudo] password for peter: 

Cualquier ayuda con esto sería muy apreciada. Estoy ejecutando Ubuntu 12.04

Gracias Peter


5
2017-11-30 14:15


origen


Respuestas:


Lo que hice cuando necesité esto fue que escribí un pequeño programa de C, cambié el propietario del archivo compilado a la raíz y establecí el bit de setuid.

Aquí está el código fuente:

#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;
}

7
2017-11-30 14:23