Como eu concedo acesso / dev / console a um executável?

5

Eu escrevi um pequeno aplicativo C para utilizar o alto-falante interno do PC. Para conseguir isso, estou falando com o /dev/console , que por sua vez faz um bip do alto-falante.

No entanto, meu executável compilado só funciona se eu executar como root . Entendo que devo adicionar o usuário executando o executável ao grupo adequado, mas não sei e não consigo descobrir quais grupos têm as permissões necessárias.

Executar o executável como o usuário que estou tentando executar no momento como ( apache ) me fornece Permission denied .

Alguma ajuda, por favor?

    
por DRS David Soft 28.11.2016 / 23:18

2 respostas

5

Você controla o acesso a um dispositivo da mesma forma que controla o acesso a um arquivo: Observando a permissão e a propriedade, e executando o programa como o usuário com permissão de acesso ou como membro do grupo com permissão de acesso.

No entanto, pelo menos no meu sistema,

$ ll /dev/console
crw------- 1 root root 5, 1 Nov 29 06:59 /dev/console

as permissões para /dev/console estão restritas apenas à raiz (provavelmente por boas razões), portanto, você precisa executá-la como raiz ou modificar as regras udev para criar /dev/console com um grupo diferente e, em seguida execute o programa como membro deste grupo (com o bit setgid ou outro).

Mas há uma maneira melhor de acessar o alto-falante do PC (que é pouco conhecido): o alto-falante aparece como um dispositivo de entrada de evento e, ao gravar no formato correto, você pode controlar diretamente o alto-falante ). O symlink independente do sistema para isso é

/dev/input/by-path/platform-pcspkr-event-spkr

e se você seguir o link simbólico, verá algo semelhante a

$ ll /dev/input/by-path/platform-pcspkr-event-spkr
lrwxrwxrwx 1 root root 9 Nov 29 06:57 /dev/input/by-path/platform-pcspkr-event-spkr -> ../event5
$ ll /dev/input/event5
crw-rw---- 1 root input 13, 69 Nov 29 06:57 /dev/input/event5

Assim, qualquer membro do grupo input pode gravar neste dispositivo, o que é mais seguro do que executá-lo como root .

O formato dos eventos usados pelo sistema de entrada é descrito em /usr/src/linux/Documentation/input/input.txt e nos arquivos de inclusão. Tudo se resume a

struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
}

com um tipo de EV_SND ("som"), ou seja, 0x12 . Basta escrever tal estrutura no arquivo. Você nem precisa de C para isso, o perl da linha de comando fará, por exemplo:

perl -e 'print pack("qssl", 0, 0x12, 2, 2000)' > /dev/input/by-path/platform-pcspkr-event-spkr

e para desligar o sinal sonoro

perl -e 'print pack("qssl", 0, 0x12, 2, 0)' > /dev/input/by-path/platform-pcspkr-event-spkr
    
por 29.11.2016 / 08:26
4

Contanto que você esteja confortável com as implicações de segurança, você pode usar o sinalizador 'setuid' para permitir que os usuários executem seu executável como root.

Primeiro altere a propriedade do executável para usuário root e grupo.

# chown root:root /path/to/your_executable

Em seguida, ative seu sinalizador setuid.

# chmod u+s /path/to/your_executable

Agora, quando qualquer usuário executar seu executável, o 'usuário efetivo' será root, permitindo acesso ao seu / dev / console.

Você pode confirmar o sinalizador setuid examinando a saída de:

$ ls -l /path/to/your_executable

A saída deve ser algo como:

-rwsr-xr-x

Observe o 's' no primeiro octeto.

    
por 29.11.2016 / 07:17