go

Go Command Line Tool Packagesをざっと試す

Go言語でコマンドラインツールを作ろうと思いましたが、サブコマンドが必要になりそうだったので調べました。 書きやすいものを探したいので次のコマンドを作るという前提で比較していきます。 ./cmd foo -name=foo args ./cmd bar -name=bar args 対象は標準パッケージと、みんなのGo言語にピックアップされている3rd packageも試してみます。 flag (標準) 大変わかりやすかったので、Go by Example: Command-Line Subcommandsをベースに簡略化して考えたいと思います。 package main import ( "flag" "fmt" "os" ) func main() { fooCmd := flag.NewFlagSet("foo", flag.ExitOnError) fooName := fooCmd.String("name", "", "name") barCmd := flag.NewFlagSet("bar", flag.ExitOnError) barName := barCmd.String("name", 0, "name") if len(os.Args) < 2 { fmt.Println("expected 'foo' or 'bar' subcommands") os.Exit(1) } switch os.Args[1] { case "foo": fooCmd.Parse(os.Args[2:]) fmt.Println("subcommand 'foo'") fmt.
Read more

gosecいいね

securego/gosecなるものを教えてもらいました。 Go ASTでセキュリティの問題がないかをチェックしてくれるようです。 どんな内容をチェックしてくれる? Available rulesがその一覧です。 もう少し細かいところは公式サイトにありますが、更新はされてなさそうですが、調べ方は次に記載します。 Gxxxって何の番号? README.mdに書いてありました。 gosecのprojectで採番している番号で、その元はCWEのようです。 対応表を見ると、例えば G102 は CWE-200 にマッチしていて、CWE-22: Improper Limitation of a Pathname to a Restricted Directory (‘Path Traversal’)とアクセスすれば良さそうです。 // GetCwe creates a cwe object for a given RuleID func GetCwe(id string) Cwe { return Cwe{ID: id, URL: fmt.Sprintf("https://cwe.mitre.org/data/definitions/%s.html", id)} } // IssueToCWE maps gosec rules to CWEs var IssueToCWE = map[string]Cwe{ "G101": GetCwe("798"), "G102": GetCwe("200"), ---snip--- } 使われてるの? リストがありました。 GitlabやVMwareなどの企業しかり、KubernetesやJenkins Xなどのプロジェクトにも使われるようですね。 使い方は? いくつかオプションがありますが、基本はこれで良さそうです。 GitHub Actionsでも gosec の名前で公開されているのでCIへの組み込みも簡単そうですね。
Read more