Acesso a / dev / ttyUSB0 e sudo

8

Esta é a minha primeira pergunta aqui.

Estou executando o Ubuntu 12.04 e tenho um aplicativo acessando a porta USB do computador. Meu nome de usuário Ubuntu é gadu . Até hoje, eu sempre usei o seguinte comando:

sudo ./gadumaster

e digitei minha senha (gadumaster é o aplicativo que acessa o USB). Este comando estava funcionando, assim como uma chamada para a função do sistema reboot () usada para reiniciar o meu laptop quando ocorreu uma condição externa do USB.

Hoje eu tive que mudar as coisas para que este aplicativo seja executado automaticamente após a inicialização do laptop. Portanto, preparei um arquivo de script e procurei uma maneira de passar a senha para o script. Depois de ler alguns artigos, decidi permitir o acesso ao USB para meu usuário, adicionando-o ao grupo de discagem :

discagem sudo adduser gadu

Após a reinicialização, pude iniciar meu aplicativo simplesmente digitando:

./gadumaster

Isso foi excelente, mas eu precisava de uma maneira de ativar também a função reboot () . Qual foi a minha surpresa quando descobri que o seguinte comando não está mais funcionando:

sudo ./gadumaster

Sim, ao executar o aplicativo com o sudo, ocorre o erro "Permissão negada" ao conectar ao USB! Note que sem o sudo funciona!

Tentei remover meu usuário do grupo de discagem:

discagem sudo deluser gadu

Após a reinicialização, cheguei à situação de que os comandos sudo e sem sudo não estavam funcionando! Mesmo a função reboot () não está funcionando em nenhuma das situações.

Alguém poderia descrever o que há de errado com o meu ubuntu? Muito obrigado antecipadamente.

arquivo / etc / sudoers :

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults    env_reset
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

O diretório /etc/sudoers.d contém apenas um arquivo README.

O erro mostrado é:

OpenComm () falhou: permissão negada.

impresso através do seguinte trecho de código - parte do aplicativo gadumaster (consulte a função perror ()):

bool SerialComm::OpenComm(const char* pszCommport, int nBaudRate, eParity Parity, eStopbits Stopbits)
{
// pszCcommport: /dev/ttyUSB0
m_fdSerial = open(pszCommport, O_RDWR | O_NOCTTY | O_NDELAY);

if(m_fdSerial < 1)
{
    m_fdSerial = 0;
    perror("OpenComm() failed: ");
    return false;
}

fcntl(m_fdSerial, F_SETFL, 0);

if(nBaudRate == 9600)
    nBaudRate = B9600;
else if(nBaudRate == 19200)
    nBaudRate = B19200;
else if(nBaudRate == 38400)
    nBaudRate = B38400;
else
{
    // OpenComm(): Unsupported baudrate!
    return false;
}

// setting baud rates and stuff
struct termios options;
tcgetattr(m_fdSerial, &options);
m_OriginalOptions = options;

cfsetispeed(&options, nBaudRate);
cfsetospeed(&options, nBaudRate);
options.c_cflag |= (CLOCAL | CREAD);

// next 4 lines setting 8N2
options.c_cflag &= ~PARENB;
options.c_cflag |= CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;

// raw input
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

// disable software flow control; disable NL->CR conversion; enable marking of Frame/Parity errors
options.c_iflag &= ~(IXON | IXOFF | IXANY | INLCR | ICRNL | PARMRK);

options.c_oflag &= ~(OPOST | ONLCR);

tcsetattr(m_fdSerial, TCSANOW, &options);
tcsetattr(m_fdSerial, TCSAFLUSH, &options);

//required to make flush work, for some reason
sleep(2);
tcflush(m_fdSerial, TCIOFLUSH);

return true;
}

NOTA: O mistério é por que o sudo ./gadumaster não está mais funcionando. O que poderia ser que nenhuma permissão seja concedida ao / dev / ttyUSB0 para superusuário?

niki kal
fonte
Você poderia postar: /etc/sudoersconteúdo do arquivo, exatamente o erro que você recebeu e o script gadumaster?
Lety
2
qual é a saída do ls -l gadumasterdiretório de arquivos?
1
CheddieMerai, isso me levou à resolução! o executável gadumaster foi mostrado no comando ls branco, colorido sobre fundo vermelho. De acordo com a documentação, este arquivo foi "setuid (u + s)". Depois que eu o apaguei e construí meu aplicativo novamente (o arquivo foi exibido novamente na cor verde), consegui executá-lo com e sem o sudo . Obrigado!
Niki kal
1
tente este link
Lety
3
@nikikal Se você encontrou a solução, sugiro colocar a pergunta em uma resposta e marcá-la como aceita, para mais alguém que se deparar com a pergunta?
Mitch

Respostas:

2

Conforme sugerido por CheddieMerai , o uso ls -l gadumasterpode indicar que você definiu permissões de arquivo incorretas. Este não é mais um problema com a conexão USB.

Você pode resolver isso reconstruindo seu aplicativo ou alterando as permissões de arquivo via chmod 775 gadumaster(ou similar) e / ou chown $USER gadumaster(você pode substituir $ USER pelo usuário que deve "possuir" o arquivo).

ApolloLV
fonte