Accès à / dev / ttyUSB0 et sudo

8

Ceci est ma première question ici.

J'utilise Ubuntu 12.04 et j'ai une application accédant 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ée pour redémarrer mon ordinateur portable lorsque certaines conditions externes de l'USB se produisaient.

Aujourd'hui, j'ai dû changer les 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 transmettre le mot de passe au script. Après avoir lu quelques articles, j'ai décidé d'autoriser l'accès à l'USB pour mon utilisateur en l'ajoutant au groupe de numérotation :

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 pour activer également la fonction reboot () . Quelle a été ma surprise quand j'ai compris 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 à USB! Notez que sans sudo ça marche!

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

composition sudo deluser gadu

Après le redémarrage, je me suis retrouvé dans une situation qui, avec sudo et sans commandes sudo, ne fonctionne pas! Même la fonction reboot () ne fonctionne dans aucune des situations.

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

Fichier / 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

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

L'erreur affichée est:

Échec d'OpenComm (): autorisation refusée.

imprimé via l'extrait de code suivant - partie 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;
}

REMARQUE: Le mystère est la raison pour laquelle sudo ./gadumaster ne fonctionne plus. Comment se fait-il qu'aucune autorisation ne soit accordée à / dev / ttyUSB0 pour le superutilisateur?

niki kal
la source
Pourriez-vous publier: /etc/sudoersle contenu du fichier, exactement l'erreur que vous avez obtenue et le script gadumaster?
Lety
2
quelle est la sortie de ls -l gadumasterdans le répertoire des fichiers?
1
CheddieMerai, cela m'a conduit à la résolution! l'exécutable gadumaster a été affiché dans la commande ls de couleur blanche sur fond rouge. Selon la documentation, ce fichier était "setuid (u + s)". Après l'avoir supprimé et reconstitué mon application (le fichier était à nouveau affiché en vert), j'ai pu à la fois l'exécuter avec et sans sudo . Merci!
niki kal
1
essayez ce lien
Lety
3
@nikikal si vous avez trouvé la solution, puis-je suggérer de mettre la question dans une réponse et de la marquer comme acceptée, pour toute autre personne qui rencontre la question?
Mitch

Réponses:

2

Comme suggéré par CheddieMerai , l'utilisation ls -l gadumasterpeut 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 censé "posséder" le fichier).

ApolloLV
la source