Недавно передо мной встала задача написать программу на 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))
   }
}

Удачи!