Akses ke / dev / ttyUSB0 dan sudo

8

Ini pertanyaan pertamaku di sini.

Saya menjalankan Ubuntu 12.04 dan memiliki aplikasi yang mengakses port USB komputer. Nama pengguna Ubuntu saya adalah gadu . Sampai hari ini, saya selalu menggunakan perintah berikut:

sudo ./gadumaster

dan memasukkan kata sandi saya (gadumaster adalah aplikasi yang mengakses USB). Perintah ini berfungsi, serta panggilan ke fungsi sistem reboot () yang digunakan untuk me-restart laptop saya ketika kondisi eksternal tertentu dari USB terjadi.

Hari ini saya harus mengubah beberapa hal sehingga aplikasi ini berjalan secara otomatis setelah laptop dinyalakan. Karena itu saya menyiapkan file skrip, dan mencari cara bagaimana meneruskan kata sandi ke skrip. Setelah membaca beberapa artikel saya memutuskan untuk mengizinkan akses ke USB untuk pengguna saya dengan menambahkannya ke grup dialout :

sudo adduser gadu dialout

Setelah mem-boot ulang, saya dapat menjalankan aplikasi dengan mengetik:

./gadumaster

Ini luar biasa, tetapi saya perlu cara untuk mengaktifkan juga fungsi reboot () . Apa yang mengejutkan saya ketika saya tahu bahwa perintah berikut ini tidak berfungsi lagi:

sudo ./gadumaster

Ya, menjalankan aplikasi dengan sudo memberi saya kesalahan "Izin ditolak" saat menghubungkan ke USB! Perhatikan bahwa tanpa sudo berfungsi!

Mencoba menghapus pengguna saya dari grup dialout:

sudo deluser gadu dialout

Setelah reboot saya masuk ke situasi yang baik dengan sudo dan tanpa perintah sudo tidak berfungsi! Bahkan fungsi reboot () tidak berfungsi di kedua situasi.

Adakah yang bisa menggambarkan apa yang salah dengan ubuntu saya? Terima kasih banyak sebelumnya.

/ etc / sudoers file:

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

Direktori /etc/sudoers.d hanya berisi satu file README.

Kesalahan yang ditampilkan adalah:

OpenComm () gagal: Izin ditolak.

dicetak melalui cuplikan kode berikut - bagian dari aplikasi gadumaster (lihat fungsi 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;
}

CATATAN: Misterinya adalah mengapa sudo ./gadumaster tidak berfungsi lagi. Apa yang bisa terjadi bahwa tidak ada izin yang diberikan kepada / dev / ttyUSB0 untuk superuser?

niki kal
sumber
Bisakah Anda memposting: /etc/sudoerskonten file, persis kesalahan yang Anda dapatkan dan skrip gadumaster?
Lety
2
apa output dari ls -l gadumasterdalam direktori file?
1
CheddieMerai, ini membawaku ke Resolusi! executable gadumaster ditunjukkan dalam perintah ls berwarna putih di atas latar belakang merah. Menurut dokumentasi, file ini adalah "setuid (u + s)". Setelah saya menghapusnya dan membangun aplikasi saya lagi (file itu lagi ditampilkan dalam warna hijau) saya bisa menjalankannya dengan dan tanpa sudo . Terima kasih!
niki kal
1
coba tautan ini
Lety
3
@nikikal jika Anda telah menemukan solusinya, bisakah saya menyarankan untuk memasukkan pertanyaan ke dalam jawaban dan menandainya sebagai diterima, untuk siapa pun yang menemukan pertanyaan itu?
Mitch

Jawaban:

2

Seperti yang disarankan oleh CheddieMerai , menggunakan ls -l gadumastermungkin memberi tahu Anda bahwa Anda menetapkan izin file yang salah. Ini bukan masalah dengan koneksi USB lagi.

Anda dapat menyelesaikan ini dengan membangun kembali aplikasi Anda atau dengan mengubah izin file melalui chmod 775 gadumaster(atau serupa) dan / atau chown $USER gadumaster(Anda dapat mengganti $ USER dengan pengguna yang seharusnya "memiliki" file).

ApolloLV
sumber