Dostęp do / dev / ttyUSB0 i sudo

8

To jest moje pierwsze pytanie tutaj.

Korzystam z systemu Ubuntu 12.04 i mam aplikację uzyskującą dostęp do portu USB komputera. Moja nazwa użytkownika Ubuntu to gadu . Do dzisiaj zawsze używałem następującego polecenia:

sudo ./gadumaster

i wpisałem moje hasło (gadumaster to aplikacja uzyskująca dostęp do USB). To polecenie działało, podobnie jak wywołanie funkcji systemowej reboot () służącej do ponownego uruchomienia laptopa, gdy wystąpiły pewne warunki zewnętrzne z USB.

Dzisiaj musiałem coś zmienić, aby ta aplikacja działała automatycznie po uruchomieniu laptopa. Dlatego przygotowałem plik skryptu i szukałem sposobu, jak przekazać hasło do skryptu. Po przeczytaniu kilku artykułów postanowiłem zezwolić użytkownikowi na dostęp do USB, dodając go do grupy połączeń :

sudo adduser gadu dialout

Po ponownym uruchomieniu mogłem uruchomić aplikację, wpisując:

./gadumaster

To było doskonałe, ale potrzebowałem sposobu, aby włączyć również funkcję restartu () . Co mnie zaskoczyło, gdy zorientowałem się, że następujące polecenie już nie działa:

sudo ./gadumaster

Tak, uruchomienie aplikacji za pomocą sudo powoduje błąd „Odmowa zezwolenia” podczas podłączania do USB! Pamiętaj, że bez sudo to działa!

Próbowałem usunąć mojego użytkownika z grupy połączeń:

sudo deluser gadu dialout

Po ponownym uruchomieniu miałem problem z tym, że zarówno z sudo, jak i bez poleceń sudo nie działa! Nawet funkcja restartu () nie działa w żadnej z tych sytuacji.

Czy ktoś mógłby opisać, co jest nie tak z moim ubuntu? Z góry dziękuję.

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

Katalog /etc/sudoers.d zawiera tylko jeden plik README.

Wyświetlany błąd to:

Błąd OpenComm (): Odmowa dostępu.

wydrukowane przez następujący fragment kodu - część aplikacji gadumaster (patrz funkcja 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;
}

UWAGA: Tajemnicą jest to, dlaczego sudo ./gadumaster już nie działa. Co może być tak, że / dev / ttyUSB0 nie otrzyma pozwolenia dla administratora?

niki kal
źródło
Czy możesz /etc/sudoersnapisać : zawartość pliku, dokładnie taki błąd, jaki masz i skrypt gadumaster?
Lety,
2
co jest wynikiem ls -l gadumasterw katalogu plików?
1
CheddieMerai, doprowadziło mnie to do rezolucji! plik wykonywalny gadumaster pokazano w białym poleceniu ls na czerwonym tle. Według dokumentacji ten plik to „setuid (u + s)”. Po usunięciu go i ponownym utworzeniu aplikacji (plik został ponownie wyświetlony w kolorze zielonym) mogłem uruchomić go zarówno z sudo, jak i bez niego . Dzięki!
niki kal
1
spróbuj tego linku
Lety
3
@nikikal, jeśli znalazłeś rozwiązanie, czy mogę zasugerować odpowiedź na pytanie i oznaczyć je jako zaakceptowane dla każdego, kto napotka pytanie?
Mitch

Odpowiedzi:

2

Jak sugeruje CheddieMerai , użycie ls -l gadumastermoże powiedzieć, że ustawiłeś nieprawidłowe uprawnienia do plików. To nie jest już problem z połączeniem USB.

Możesz rozwiązać ten problem, odbudowując aplikację lub zmieniając uprawnienia do pliku za pomocą chmod 775 gadumaster(lub podobnego) i / lub chown $USER gadumaster(możesz zamienić $ USER na użytkownika, który powinien „posiadać” plik).

ApolloLV
źródło