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