###### 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
