web-dev-qa-db-ja.com

root権限なしで仮想シリアルポートを使用するにはどうすればよいですか?

背景: このWifi-シリアルアダプタ を使用して、Kubuntu 16.04(64ビット)で実行されている Stellarium を介して望遠鏡を制御したいと思います。

このコマンドラインでsocatを使用して仮想COMポートを作成しました:

$ Sudo socat pty,link=/dev/virtualcom0,raw tcp:10.0.0.1:4030

ここに新しいデバイスが表示されます:

$ ls -l /dev/virtualcom0 
lrwxrwxrwx 1 root root 10 2017-07-03 09:05 virtualcom0 -> /dev/pts/6
$ ls -l /dev/pts/6
crw--w---- 1 root tty 136, 6 2017-07-03 09:05 /dev/pts/6

/dev/virtualcom0を使用しようとしています。例: root権限でpicocommを実行している限り、picosommで動作します。しかし、標準のユーザー権限でポートを使用しようとすると、エラーが発生しました。

$ picocom /dev/virtualcom0 --baud 9600 --imap lfcrlf
FATAL: cannot open /dev/virtualcom0: Permission denied

おそらくこれのための特別なudevルールを定義することによって、標準のユーザー権限で仮想COMポートにアクセスできるようにする方法はありますか?

#1を編集

Dirktの答えの好ましいアプローチに従って、私は現在、以下を使用しています。

$ socat pty,link=/tmp/virtualcom0,raw tcp:10.0.0.1:4030

これはmacOSでも正常に機能することに注意してください(homebrew経由でsocatをインストールした後)。

2
Joe

なぜ仮想シリアルポートが必要なのか完全には理解していません。 telnet 10.0.0.1 4030

次に、通常のユーザーとしてsocatなしでSudoを実行し、アクセス可能なパスを選択します。 /tmp/vcom0(または何でも)。

それが何らかの理由で機能せず、Sudoを実行できることが明らかな場合は、所有者を変更してみてください

Sudo chown your_username /dev/virtualcom0

または権限

Sudo chmod o+rw /dev/virtualcom0

編集

特定の疑似ttyに対してudevルールを作成しようとしないでください。第一に、それがどの疑似ttyであるかを事前に知らないこと、第二に、疑似ttyが至る所で使用されていること、そして他のプログラムが別のユーザーのためにこの疑似ttyを作成した場合、他のプログラムは失敗します。

最もクリーンな解決策は、バリアント(1)(/tmp/vcom0)。

他のバリアントを主張する場合は、socatchmod/chownの両方を含む短いスクリプトを作成し、Sudoを使用してそのスクリプトを実行します。必要に応じて、readlinkを使用してシンボルリンクをたどることができます。

もう1つの方法は、通常のユーザーとしてsocatと作成したリンクを使用してstellariumの両方を呼び出し、完了時にsocatを強制終了する短いスクリプトを作成することです。そのスクリプトを使用してstellariumを開始します。

4
dirkt

Socatのmanページを調べたところ、答えが見つかりました。

コマンドラインにさらにいくつかの式を追加することで、ptyの属性にモードとグループを追加できます。あなたの例に従うが、ダイヤルアウトグループが所有する新しいシリアルポートとそのグループの読み取り/書き込みアクセスを使用するには、次のようにします。

$ Sudo socat pty,link=/dev/virtualcom0,raw,group-late=dialout,mode=660 tcp:10.0.0.1:4030
1
Efpophis