日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pac相关项目记录

發布時間:2024/3/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pac相关项目记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目

就是獲取和設置這個腳本地址, 包括下圖"使用設置腳本"的開/關

pac

在pac-cmd外面用Go語言封裝了一層

特點

  • 只有3個函數/方法可用
  • pac.EnsureHelperToolPresent(fullPath, prompt, iconFullPath)pac.On(pacUrl string)pac.Off()

    不足

  • pac-cmd可以通過重定向獲得pacUrl,這個pac好像沒有對應的Show方法/函數,就是沒辦法獲得操作系統當前的pacUrl
  • 把二進制文件直接讀出字節寫死在Go源碼里,應該可以有更好的的方式
  • 上面一步的字節切片和已有的文件的比較,逐個字節比較
  • 解讀

    EnsureHelperToolPresent

    保證pac-cmd的二進制文件的存在,核心函數

  • 第二個參數,只在蘋果系統上有用, 蘋果會彈出提示框
  • 第一個if判斷windows系統上的后綴名是_386.exe還是_amd64.exe
  • 其中Asset()只是把string轉為[]byte,見收獲(2)
  • byteexec.New()就是把第2步生成的文件寫入到了filepath.Join(os.Getenv(“APPDATA”), “byteexec”)(如: C:\Users\Administrator\AppData\Roaming\byteexec)下面,這其中,判斷了如果文件存在,是否一致的情況,不一致就重新寫入,但是他這個判斷是否一致,是一個字節一個字節的判斷的.感覺應該有更好的方式
  • ensureElevatedOnDarwin,只是在蘋果系統上才會進行條件編譯
  • 總結下: 以windows系統為例,就是在指定的目錄下生成了個exe的可執行文件,這個exe的源碼以string的形式寫死在Go源代碼里了
  • // EnsureHelperToolPresent checks if helper tool exists and extracts it if not. // On Mac OS, it also checks and set the file's owner to root:wheel and the setuid bit, // it will request user to input password through a dialog to gain the rights to do so. // path: absolute or relative path of the file to be checked and generated if // not exists. Note - relative paths are resolved relative to the system- // specific folder for aplication resources. // prompt: the message to be shown on the dialog. // iconPath: the full path of the icon to be shown on the dialog. func EnsureHelperToolPresent(path string, prompt string, iconFullPath string) (err error) {mu.Lock()defer mu.Unlock()assertName := "pac"// Load different binaries for 32bit and 64bit Windows respectively.if runtime.GOOS == "windows" {suffix := "_386.exe"// https://blogs.msdn.microsoft.com/david.wang/2006/03/27/howto-detect-process-bitness/if strings.EqualFold(os.Getenv("PROCESSOR_ARCHITECTURE"), "amd64") ||strings.EqualFold(os.Getenv("PROCESSOR_ARCHITEW6432"), "amd64") {suffix = "_amd64.exe"}assertName = assertName + suffix}pacBytes, err := Asset(assertName)if err != nil {return fmt.Errorf("Unable to access pac asset: %v", err)}be, err = byteexec.New(pacBytes, path)if err != nil {return fmt.Errorf("Unable to extract helper tool: %v", err)}return ensureElevatedOnDarwin(be, prompt, iconFullPath) }
    pac.On和pac.Off

    就是簡單的命令行調用,調用EnsureHelperToolPresent生成的二進制文件.在windows下就相當于sysproxy-cmd.exe on xxxx這樣

    pac-cmd

    就是一個C語言寫的跨平臺的改變操作系統的自動代理設置, 不同的平臺有不同的二進制文件

    特點

    只是個二進制文件,單獨執行這個二進制文件是不會在命令行有任何輸出的,需要把輸出進行重定向

    pac_amd64.exe show > 1.txt

    如何做到無控制臺輸出的

    比如show命令,源碼里是printf了的:

    if ((options.pOptions[0].Value.dwValue & PROXY_TYPE_AUTO_PROXY_URL) > 0) {if (options.pOptions[1].Value.pszValue != NULL) {printf("%s\n", options.pOptions[1].Value.pszValue);}}

    是通過編譯選項控制的
    Makefile里有如下控制:
    LDFLAGS += -l rasapi32 -l wininet -Wl,–subsystem,windows
    就是 -Wl,–subsystem,windows 做到的無控制臺輸出

    Go語言里如何獲取上面的輸出

    上面的C語言在鏈接的時候控制了不向命令行輸出
    可以用如下代碼

    func show(){cmd := exec.Command("pac_amd64.exe", "show")b,err:=cmd.CombinedOutput()if err!=nil{panic(err)}fmt.Println(string(b)) }

    收獲

  • strings.EqualFold()比較的unicode碼,而且忽略大小寫

  • string轉[]byte更有效率的方式->Feature: provide no-copy conversion from []byte to string

  • []byte相等比較用bytes.Compare

  • 文件的Sync When to flush a file in Go?,感覺就如這個回復說的一樣,只是為了盡可能的保證文件的寫入的完整性,因為有可能在你Close之前程序崩潰了,導致文件沒寫入

    When you want to ensure data integrity as much as possible. For example, what happens if your program crashes before it comes to closing the file?
  • 在Golang里要借助跨平臺的二進制可執行文件,可以把二進制文件都讀出來,以string的方式寫死在Go源代碼里,要用的時候再寫為對應平臺的二進制文件

  • C語言控制控制臺無輸出及Go語言獲取這種輸出

  • 總結

    以上是生活随笔為你收集整理的pac相关项目记录的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。