Udev

如何在沒有root權限的情況下使用虛擬串口?

  • April 4, 2019

背景:我想使用 這個 Wifi-to-Serial 適配器通過 在 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

只要我以root權限執行,就可以嘗試使用/dev/virtualcom0例如。但是當我嘗試使用具有標準使用者權限的埠時,出現錯誤:picocomm``picosomm

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

知道如何使用標準使用者權限使虛擬 com 埠可訪問,也許為此定義一個特殊的 udev 規則?

編輯#1

按照 dirkt 回答的首選方法,我現在正在使用:

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

請注意,這在 macOS 上也可以正常工作(通過自製軟體安裝 socat 之後)。

我完全不明白為什麼你需要一個虛擬串口。如果你只是會發生什麼telnet 10.0.0.1 4030

接下來的事情是在socat沒有sudo普通使用者的情況下執行並選擇一個可訪問的路徑,例如/tmp/vcom0(或其他)。

如果由於某種原因這不起作用,而您顯然可以做到sudo,請嘗試更改所有者

sudo chown your_username /dev/virtualcom0

或權限

sudo chmod o+rw /dev/virtualcom0

編輯

不要試圖udev為特定的偽 tty 制定規則。首先,你事先不知道它是哪個偽 tty,其次,偽 tty 到處都在使用,如果其他程序碰巧為另一個使用者創建了這個偽 tty,它們就會失敗。

最乾淨的解決方案是使用變體 (1) ( /tmp/vcom0)。

如果您堅持使用其他變體,請製作一個包含 thesocatchmod/的短腳本chown,並使用sudo. readlink如有必要,您可以使用 跟隨符號連結。

另一種選擇是編寫一個簡短的腳本,socat以普通使用者的身份呼叫,並stellarium使用它創建的連結,並socat在完成後終止。使用該腳本啟動stellarium.

引用自:https://unix.stackexchange.com/questions/374916