使用 grep 從 SOCAT 命令獲取虛擬通信埠地址
我需要socat生成的虛擬com埠的地址,一般是/dev/pts/2和/dev/pts/3。我需要這些地址,因為有時它會與原始地址不同。我需要這個,因為我正在嘗試創建一個每次系統重新啟動時都需要這些地址的應用程序。
我嘗試了各種方法來獲得相同但沒有成功
socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed "2,3d"
正在輸出
2020/06/02 01:20:02 震驚
$$ 24206 $$N PTY 是 /dev/pts/4
但
socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed '2,3d'|cut -d " " -f 7
沒有輸出
我需要將 2 個 com 埠地址儲存在 2 個變數中,然後將它們傳遞給我的應用程序 感謝您的幫助和支持
錯誤的問題(及其解決方案)
您在問題中描述的問題是由於塊緩衝而不是行緩衝,當命令的輸出不是終端時,某些命令會發生這種情況以優化性能。該命令有一個選項,您可以使用它。在這裡:
sed -u
得到:socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed -u '2,3d' |cut -d " " -f 7
或者它沒有,您可以使用通用工具,如
stdbuf
orunbuffer
來避免這種情況發生。例如,如果您在 之後添加一個新管道cut
,您可能必須使用:[...] | stdbuf -oL cut -d " " -f 7 | [...]
那就是說……只是忘記它為您的實際問題。解析調試輸出並不是實現某些目標的最佳方法。例如,我的版本
socat
在第 1 行和第 2 行輸出 pty,我需要sed -u 3d
等。實際解決方案
實際上,
socat
可以選擇處理您的具體問題:
PTY
生成一個偽終端 (pty) 並使用它的主端。
$$ … $$ 有用的選項:link、openpty、wait-slave、mode、user、group
之後:
PTY 選項組
這些選項旨在與 pty 地址類型一起使用。
link=<filename>
生成指向實際偽終端 (pty) 的符號連結。這可能有助於解決 pty 生成的名稱或多或少不可預測的問題,從而難以直接自動訪問 socat 生成的 pty。使用此選項,使用者可以在文件層次結構中指定一個“修復”點,以幫助他訪問實際的 pty(範例)。從 socat 版本 1.4.3 開始,當地址關閉時符號連結被刪除(但請參見選項 unlink-close)。
在範例部分:
socat PTY,link=$HOME/dev/vmodem0,rawer,wait-slave \ EXEC:"ssh modemserver.us.org socat - /dev/ttyS0,nonblock,rawer"
$$ … $$
所以你可以這樣解決問題:
socat pty,raw,echo=0,link=$HOME/socatpty1 pty,raw,echo=0,link=$HOME/socatpty2
例如創建:
$ ls -l $HOME/socatpty[12] lrwxrwxrwx. 1 user user 11 Jun 1 21:58 /home/user/socatpty1 -> /dev/pts/15 lrwxrwxrwx. 1 user user 11 Jun 1 21:58 /home/user/socatpty2 -> /dev/pts/16
您可能需要稍後或之前清理這些連結,尤其是在
socat
被中斷的情況下。