通過瀏覽器執行cmd命令、啟動steam
阿新 • • 發佈:2021-06-30
我們先來看看實現起來的效果,我們在瀏覽器中輸入ping so.com
試試開啟計算器、啟動steam
要實現這個效果其實用到了瀏覽器自定義協議,我們可以通過自定義協議開啟wechat、扣扣、emali應用等待。比如在web客服系統中通常會使用tencent://
自定義協議提供一個扣扣聊天按鈕,當我們點選時瀏覽器會啟動外部應用。
我們將自定義協議寫入登錄檔後,瀏覽器會根據協議啟動我們的先導應用,如下在tencent://
協議中啟動了一個Timwp.exe
,Timwp.exe
將URL引數解析後啟動對應服務。
據此我們就可以自己註冊一個cmd
協議來啟動我們的應用。我們將如下urlCmd.reg
登錄檔檔案匯入到登錄檔HKEY_CLASSES_ROOT
URL Protocol
,他的目錄結構為HKEY_CLASSES_ROOT\cmd\shell\open\command
。
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\cmd] @="URL: cmd protocol" "URL Protocol"="" [HKEY_CLASSES_ROOT\cmd\shell] [HKEY_CLASSES_ROOT\cmd\shell\open] [HKEY_CLASSES_ROOT\cmd\shell\open\command] @="C:\\Windows\\system32\\urlCmd.exe \"%1\""
匯入後看起來是這樣的,我們要啟動的先導應用為C:\Windows\system32\urlCmd.exe
接下來我們要編寫一個urlCmd.exe
來實現我們需要的功能,這裡我們通過go來編寫,我們將傳過來的URL解析為<command> <arg>
形式,然後呼叫cmd來執行。注意傳參是經過URL編碼的,在下面urlCmd.go
我們只做了空格的解碼。
//urlCmd.go package main import ( "fmt" "log" "os" "os/exec" "strings" "time" ) func main() { var cmd_args, cmd_com string // 帶引數 不帶參 cmd_all := os.Args[1:] // [cmd://<command>%20<arg>] [cmd://<command>/] cmd_cmd := strings.Split(string(cmd_all[0]), "//") // [cmd: <command>%20<arg>] [cmd: <command>/] cmd_pre := strings.Split(string(cmd_cmd[1]), "%20") // [<command> <arg>] [<command>/] if len(cmd_pre) == 1 { cmd_args = "" // 引數為空 } else { cmd_args = strings.Replace(cmd_pre[1], "/", "", 1) } cmd_com = strings.Replace(cmd_pre[0], "/", "", 1) fmt.Printf("\ncommand: %v\nargs: %v\n", cmd_com, cmd_args) cmd := exec.Command("cmd", "/c", cmd_com, cmd_args) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { log.Fatalf("err:%v", err) } time.Sleep(2 * time.Second) }
我們build一下編譯成exe檔案
go bulid urlCmd.go
將urlCmd.exe
放到C:\Windows\system32\
目錄下即可,這樣我們在瀏覽器以cmd://
協議開啟的URL都會路由到這個應用啦。
我學廢了,你呢?urlCmd.go
還有許多改進空間,有興趣的同學可以做一個自己的解析器試試哦。
文章有不足的地方歡迎在評論區指出。
歡迎收藏、點贊、提問。關注頂級飲水機管理員,除了管燒熱水,有時還做點別的。