golang替換無法顯示的特殊字符(\u0000,?\000,?^@)
描述
在linux中獲取進(jìn)程cmdline時(shí)遇到隱藏符號問題,如下:
[root@vm010066016161 /root] #cat /proc/45/cmdline /usr/sbin/sshd-D [root@vm010066016161 /root] #cat /proc/45/cmdline -A /usr/sbin/sshd^@-D^@ [root@vm010066016161 /root] #cat /proc/45/cmdline | sed -n 'l' /usr/sbin/sshd\000-D\000$ [root@vm010066016161 /root]
這樣的數(shù)據(jù)直接在終端顯示是沒問題的,但是記錄到日志中,變成:
{"level":"info","ts":1650267870.4412727,"caller":"ssh/manager.go:78","msg":"/usr/sbin/sshd\u0000-D\u0000"}
或
/usr/sbin/sshd-D
而系統(tǒng)實(shí)際的進(jìn)程啟動參數(shù)為:
root 45 1 0 Jan12 ? 00:01:57 /usr/sbin/sshd -D
此時(shí),如果查看切片的內(nèi)容,可以看到包含了無法顯示的ascii碼,空格碼點(diǎn)變成了0(我們要做的是把這個(gè)替換為十進(jìn)制32對應(yīng)真實(shí)的空格)
[]byte: [47 117 115 114 47 115 98 105 110 47 115 115 104 100 0 45 68 0]
解決方法一,手動處理
這里只貼上主要代碼:
cmd := fmt.Sprintf("cat /proc/%s/cmdline", pid)
cmdline, _, err := e.SSHManager.Run(cmd)
if err != nil {
e.logger.Error(fmt.Sprintf("pid(%s) CMDLine error[%s]", pid, err.Error()))
return err
}
newByte := make([]byte, 0)
for _, b := range []byte(cmdline) {
if b == 0 { //小于32的字符都可以以這樣的方式處理,本次只處理0
newByte = append(newByte, 32)
} else {
newByte = append(newByte, b)
}
}
newResult := strings.TrimSpace(string(newByte)) //結(jié)果的空格不需要
解決方法二,使用bytes庫(推薦)
// ...略
newByte := bytes.ReplaceAll([]byte(cmdline), []byte{0}, []byte{32})
newByte = bytes.TrimSpace(newByte)
newResult := string(newByte)
if len(newResult) > 64 {
newResult = newResult[:64]
}
e.Pids[pid].CMDLine = newResult到此這篇關(guān)于golang替換無法顯示的特殊字符(\u0000, \000, ^@)的文章就介紹到這了,更多相關(guān)golang替換字符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言HTTPServer開發(fā)的六種方式小結(jié)
Golang的Server開發(fā)顯得非常簡單,有很多種方式,本文就介紹了Go語言HTTPServer開發(fā)的六種方式,具有一定的參考價(jià)值,感興趣的可以了解一下2021-11-11
Goland使用delve進(jìn)行遠(yuǎn)程調(diào)試的詳細(xì)教程
網(wǎng)上給出的使用delve進(jìn)行遠(yuǎn)程調(diào)試,都需要先在本地交叉編譯或者在遠(yuǎn)程主機(jī)上編譯出可運(yùn)行的程序,然后再用delve在遠(yuǎn)程啟動程序,本教程會將上面的步驟簡化為只需要兩步,1,在遠(yuǎn)程運(yùn)行程序2,在本地啟動調(diào)試,需要的朋友可以參考下2024-08-08

