---
# System prepended metadata

title: Домашнее задание к занятию «Программирование на Go - структуры и методы»
tags: [security, netology]

---

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