golang替換無法顯示的特殊字符(\u0000,?\000,?^@)
描述
在linux中獲取進程cmdline時遇到隱藏符號問題,如下:
[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ù)為:
root 45 1 0 Jan12 ? 00:01:57 /usr/sbin/sshd -D
此時,如果查看切片的內(nèi)容,可以看到包含了無法顯示的ascii碼,空格碼點變成了0(我們要做的是把這個替換為十進制32對應(yīng)真實的空格)
[]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)文章
關(guān)于go-zero單體服務(wù)使用泛型簡化注冊Handler路由的問題
這篇文章主要介紹了go-zero單體服務(wù)使用泛型簡化注冊Handler路由,涉及到Golang環(huán)境安裝及配置Go Module的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07Golang實現(xiàn)定時任務(wù)的幾種方法小結(jié)
在 Golang 開發(fā)中,定時任務(wù)是常見的需求,本文將介紹幾種在 Golang 中實現(xiàn)定時任務(wù)的方法,包括 time 包的定時器、ticker,以及第三方庫 cron,并通過示例代碼展示它們的使用方式,需要的朋友可以參考下2024-01-01golang gorm 計算字段和獲取sum()值的實現(xiàn)
這篇文章主要介紹了golang gorm 計算字段和獲取sum()值的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12深入理解Go gin框架中Context的Request和Writer對象
這篇文章主要為大家詳細介紹了Go語言的gin框架中Context的Request和Writer對象,文中的示例代碼講解詳細,對我們深入了解Go語言有一定的幫助,快跟隨小編一起學(xué)習(xí)一下吧2023-04-04golang中range在slice和map遍歷中的注意事項
今天小編就為大家分享一篇關(guān)于golang中range在slice和map遍歷中的注意事項,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04