web-dev-qa-db-ja.com

/ dev / ttyUSB0およびsudoへのアクセス

これが私の最初の質問です。

Ubuntu 12.04を実行していますが、コンピューターのUSBポートにアクセスするアプリケーションがあります。私のUbuntuユーザー名はgaduです。今日まで、私は常に次のコマンドを使用していました。

Sudo ./gadumaster

パスワードを入力しました(gadumasterはUSBにアクセスするアプリケーションです)。このコマンドは機能していました。また、システム関数reboot()への呼び出しは、USBから特定の外部条件が発生したときにラップトップを再起動するために使用されました。

今日は、ラップトップの起動後にこのアプリケーションが自動的に実行されるように変更する必要がありました。したがって、スクリプトファイルを準備し、パスワードをスクリプトに渡す方法を探しました。いくつかの記事を読んだ後、USBをdialoutグループに追加して、ユーザーにUSBアクセスを許可することにしました。

Sudo adduser gaduダイヤルアウト

再起動後、次のように入力するだけでアプリケーションを開始できました。

./gadumaster

これは優れていましたが、reboot()関数も有効にする方法が必要でした。次のコマンドが機能しなくなったことがわかったとき、私は驚きました。

須藤./gadumaster

はい、Sudoでアプリケーションを実行すると、USBへの接続時に「Permission denied」というエラーが表示されます。 Sudoがなくても動作することに注意してください!

ダイアルアウトグループからユーザーを削除しようとしました:

須藤デルセルガドゥダイヤルアウト

再起動後、Sudoコマンドを使用する場合とSudoコマンドを使用しない場合動作していません!でもreboot()関数はどちらの状況でも機能しません。

私のubuntuの何が間違っているのか誰にも説明できますか?事前に感謝します。

/ 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

ディレクトリ/etc/sudoers.dには、READMEファイルが1つだけ含まれています。

表示されるエラーは次のとおりです。

OpenComm()が失敗しました:許可が拒否されました。

次のコードスニペットを介して出力-gadumasterアプリの一部(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;
}

注:謎はSudo ./gadumasterがもう機能しない理由です。スーパーユーザーに対して/ dev/ttyUSB0に許可が与えられていないのはどうしてでしょうか?

8
niki kal

CheddieMerai で示唆されているように、ls -l gadumasterを使用すると、誤ったファイル許可が設定されていることがわかります。これはもうUSB接続の問題ではありません。

これを解決するには、アプリケーションを再構築するか、chmod 775 gadumaster(または同様の)および/またはchown $USER gadumasterを使用してファイルのアクセス許可を変更します($ USERをファイルを「所有」するユーザーに置き換えることができます)。

2
ApolloLV