我有這段代碼,主要取自這里:fmt.Println("Please enter your role: ")fmt.Scanf("%s", &roleName)flag.StringVar(&startURL, "start-url", "", "AWS SSO Start URL")flag.StringVar(&accountID, "account-id", "", "AWS Account ID to fetch credentials for")flag.Parse()if startURL == "" || accountID == "" || roleName == "" { flag.Usage() os.Exit(1)}cfg := aws.Config{Region: "eu-west-1"}// create sso oidc client to trigger login flowssooidcClient := ssooidc.NewFromConfig(cfg)// register your client which is triggering the login flowregister, err := ssooidcClient.RegisterClient(context.TODO(), &ssooidc.RegisterClientInput{ ClientName: aws.String("sample-client-name"), ClientType: aws.String("public"), Scopes: []string{"sso-portal:*"},})if err != nil { fmt.Println(err)}// authorize your device using the client registration responsedeviceAuth, err := ssooidcClient.StartDeviceAuthorization(context.TODO(), &ssooidc.StartDeviceAuthorizationInput{ ClientId: register.ClientId, ClientSecret: register.ClientSecret, StartUrl: aws.String(startURL),})if err != nil { fmt.Println(err)}// trigger OIDC login. open browser to login. close tab once login is done. press enter to continueurl := aws.ToString(deviceAuth.VerificationUriComplete)fmt.Printf("If browser is not opened automatically, please open link:\n%v\n", url)err = browser.OpenURL(url)if err != nil { fmt.Println(err)}fmt.Println("Press ENTER key once login is done")// These lines get skipped on Windows// also tried bufio.NewReader(os.Stdin).ReadBytes('\n')// and fmt.Scanf("%s", &test)scanner := bufio.NewScanner(os.Stdin)scanner.Scan()if scanner.Err() != nil { fmt.Println()}在 MacOS 上,程序等待用戶輸入,因此 SSO 登錄完美運行,在 Windows 上它被跳過,用戶沒有時間接受 AWS 端的登錄,因此程序失敗。此外,第一個詢問用戶角色的提示工作正常,所以我真的不明白第二個被跳過了嗎?我使用這些命令從 MacOS 機器構建二進制文件:GOOS=darwin go buildGOOS=windows go build
1 回答

largeQ
TA貢獻2039條經驗 獲得超8個贊
fmt.Scanf("%s", &roleName)讀取令牌后的第一個空白字符后調用返回。
Windows 上的行終止符是\r\n. fmt.Scanf 調用在讀取\r. \n仍然在標準輸入中。后面的調用讀取stdinscanner.Scan()中的剩余部分并立即返回。\n
其他系統上的行終止符是\n。fmt.Scanf 調用在讀取整個行終止符后返回。調用scanner.Scan()等待用戶鍵入另一個行終止符。
一種解決方法是對所有輸入使用掃描儀:
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("Please enter your role: ")
if !scanner.Scan() {
// handle EOF
}
roleName = strings.TrimSpace(scanner.Text())
…
fmt.Println("Press ENTER key once login is done")
scanner.Scan()
…
- 1 回答
- 0 關注
- 115 瀏覽
添加回答
舉報
0/150
提交
取消