Недавно передо мной встала задача написать программу на Golang, которую может запустить только другая конкретная программа, так что запустить ее сможет не каждый желающий. Решение, которое было принято, состояло в том, чтобы создать рукопожатие между двумя программами — исполняемая программа ожидает получения ключа от работающей программы, и только если ключ правильный, выполнение продолжится.
Ниже приведен краткий учебник, в котором объясняется, как передавать данные и проверять их между двумя программами.
Исполняемая программа
Должна быть переменная, содержащая общий ключ между программами:
var sharedString = "SecretKey\n"
Скрипт должен дождаться ввода в стандартный ввод:
reader := bufio.NewReader(os.Stdin) input, _ := reader.ReadString('\n')
Сравните ввод с имеющимся у вас ключом и продолжите выполнение в соответствии с результатами сравнения:
if input == sharedString { fmt.Println("correct key") // continue execution } else { fmt.Println("wrong key - abort execution") os.Exit(1) }
И полный скрипт:
package main import ( "bufio" "fmt" "os" ) var sharedString = "SecretKey\n" func main() { reader := bufio.NewReader(os.Stdin) input, _ := reader.ReadString('\n') if input == sharedString { fmt.Println("correct key") // continue execution } else { fmt.Println("wrong key - abort execution") os.Exit(1) } }
Программа для бега
Общий ключ и путь ко второй программе нужно как-то сохранить:
var ( sharedString = "SecretKey\n" pathToExecutedProgram = "path/to/program" )
Напишите команду, запускающую вторую программу:
command := exec.Command(pathToExecutedProgram, "arg1", "arg2")
Установите стандартный ввод команды для чтения общего ключа:
command.Stdin = strings.NewReader(sharedString)
Теперь запустите команду:
output, err := command.Output() if err == nil { fmt.Println(string(output)) }
И полный скрипт:
var ( sharedString = "SecretKey\n" pathToExecutedProgram = "path/to/program" ) func executeProgram() { command := exec.Command(pathToExecutedProgram, "arg1", "arg2") command.Stdin = strings.NewReader(sharedString) output, err := command.Output() if err == nil { fmt.Println(string(output)) } }
Удачи!