通過瀏覽器執行cmd命令、啟動steam

頂級飲水機管理員發表於2021-06-30

我們先來看看實現起來的效果,我們在瀏覽器中輸入ping so.com

cmd_ping

試試開啟計算器、啟動steam

cmd_steam

要實現這個效果其實用到了瀏覽器自定義協議,我們可以通過自定義協議開啟wechat、扣扣、emali應用等待。比如在web客服系統中通常會使用tencent://自定義協議提供一個扣扣聊天按鈕,當我們點選時瀏覽器會啟動外部應用。

我們將自定義協議寫入登錄檔後,瀏覽器會根據協議啟動我們的先導應用,如下在tencent://協議中啟動了一個Timwp.exeTimwp.exe將URL引數解析後啟動對應服務。

image-20210629225401310

據此我們就可以自己註冊一個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

image-20210629225551325

接下來我們要編寫一個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都會路由到這個應用啦。

cmd_chrome


我學廢了,你呢?urlCmd.go還有許多改進空間,有興趣的同學可以做一個自己的解析器試試哦。


文章有不足的地方歡迎在評論區指出。

歡迎收藏、點贊、提問。關注頂級飲水機管理員,除了管燒熱水,有時還做點別的。

相關文章