###### tags: `netology` `security` # Домашнее задание к занятию «Программирование на Go - структуры и методы» 1. Исходный код вашего приложения ```go= package main import ( "fmt" "os" "os/exec" "runtime" ) func main() { var command, sh, c string switch { case runtime.GOOS == "windows": command = "net user" sh = "cmd" c = "/C" case runtime.GOOS == "linux" || runtime.GOOS == "darwin": command = "cat /etc/passwd" sh = "sh" c = "-c" default: fmt.Print("Your platform is not supported") os.Exit(1) } cmd := exec.Command(sh, c, command) output, err := cmd.Output() if err != nil { fmt.Print(err) os.Exit(1) } fmt.Print(string(output)) } ``` --- 3. За что отвечает флаг -c в sh и /C в cmd? Конкретно флаг `-c` читает из строки (которая следует после) команду для `sh`, `|C` делает то же самое. Но, передаваемые команды исполняются не в том же процессе, в котором запущена сама программа, а в отдельно инстанцированном `shell`/`cmd`. --- 5. Что будет, если попробовать исполнить те же команды напрямую в вашем приложении, без sh -c или cmd /C? В нашем случае ничего особенного не произойдет. Точно так же будут выведены все пользователи. --- 6. Сборочный скрипт ```shell= #!/bin/sh GOARCH=amd64 CGO_ENABLED=0 GOOS=windows go build -o users.exe main.go GOARCH=amd64 CGO_ENABLED=0 GOOS=linux go build -o users.bin main.go GOARCH=amd64 CGO_ENABLED=0 GOOS=darwin go build -o users.ibin main.go ``` --- 7. Пример вывода вашей программы в ОС Windows ![](https://i.imgur.com/3z5AT7F.jpg)