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?
sumber
/etc/sudoers
konten file, persis kesalahan yang Anda dapatkan dan skrip gadumaster?ls -l gadumaster
dalam direktori file?Jawaban:
Seperti yang disarankan oleh CheddieMerai , menggunakan
ls -l gadumaster
mungkin 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 / atauchown $USER gadumaster
(Anda dapat mengganti $ USER dengan pengguna yang seharusnya "memiliki" file).sumber