web-dev-qa-db-fra.com

Accès à / dev / ttyUSB0 et à sudo

Ceci est ma première question ici.

J'utilise Ubuntu 12.04 et une application accède au port USB de l'ordinateur. Mon nom d'utilisateur Ubuntu est gadu . Jusqu'à aujourd'hui, j'ai toujours utilisé la commande suivante:

Sudo ./gadumaster

et entré mon mot de passe (gadumaster est l'application accédant à l'USB). Cette commande fonctionnait, ainsi qu'un appel à la fonction système reboot () utilisé pour redémarrer mon ordinateur portable lorsque certaines conditions externes de l'USB se produisaient.

Aujourd'hui, j'ai dû changer des choses pour que cette application s'exécute automatiquement après le démarrage de l'ordinateur portable. Par conséquent, j'ai préparé un fichier de script et cherché un moyen de passer le mot de passe au script. Après avoir lu quelques articles, j'ai décidé d'autoriser l'accès à l'USB à mon utilisateur en l'ajoutant au groupe dialout :

Sudo adduser gadu dialout

Après le redémarrage, j'ai pu démarrer mon application en tapant simplement:

./gadumaster

C'était excellent, mais j'avais besoin d'un moyen d'activer également la fonction reboot () . Quelle a été ma surprise lorsque j'ai découvert que la commande suivante ne fonctionnait plus:

Sudo ./gadumaster

Oui, l'exécution de l'application avec Sudo me donne l'erreur "Autorisation refusée" lors de la connexion à l'USB! Notez que sans Sudo cela fonctionne!

J'ai essayé de retirer mon utilisateur du groupe de numérotation:

Sudo deluser gadu dialout

Après le redémarrage, je me suis rendu compte que les commandes avec Sudo et sans Sudo ne fonctionnaient pas! Même la fonction reboot () ne fonctionne dans aucune de ces situations.

Quelqu'un pourrait-il décrire ce qui ne va pas avec mon Ubuntu? Merci beaucoup d'avance.

/ etc/sudoers fichier:

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

Le répertoire /etc/sudoers.d contient un seul fichier README.

L'erreur montrée est:

OpenComm () a échoué: autorisation refusée.

imprimé via l'extrait de code suivant - élément de l'application gadumaster (voir la fonction 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;
}

NOTE: Le mystère est pourquoi Sudo ./gadumaster ne fonctionne plus. Que pourrait-il être qu'aucune autorisation ne soit accordée à/dev/ttyUSB0 pour le superutilisateur?

8
niki kal

Comme suggéré par CheddieMerai , utiliser ls -l gadumaster peut vous indiquer que vous définissez des autorisations de fichier incorrectes. Ce n'est plus un problème avec la connexion USB.

Vous pouvez résoudre ce problème en reconstruisant votre application ou en modifiant les autorisations de fichier via chmod 775 gadumaster (ou similaire) et/ou chown $USER gadumaster (vous pouvez remplacer $ USER par l'utilisateur supposé "posséder" le fichier).

2
ApolloLV