aws sdk Go: bufioNewScanner在MacOS上工作,但在Windows上跳过



我有这段go代码,主要来自这里:

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 flow
ssooidcClient := ssooidc.NewFromConfig(cfg)
// register your client which is triggering the login flow
register, 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 response
deviceAuth, 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 continue
url := aws.ToString(deviceAuth.VerificationUriComplete)
fmt.Printf("If browser is not opened automatically, please open link:n%vn", 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()
}
token, err := ssooidcClient.CreateToken(context.TODO(), &ssooidc.CreateTokenInput{
ClientId:     register.ClientId,
ClientSecret: register.ClientSecret,
DeviceCode:   deviceAuth.DeviceCode,
GrantType:    aws.String("urn:ietf:params:oauth:grant-type:device_code"),
})

在MacOS上,程序等待用户输入,因此SSO登录工作完美,在Windows上,它被跳过,用户没有时间接受AWS端的登录,因此程序失败。此外,询问用户角色的第一个提示正常工作,所以我真的不明白第二个提示被跳过了。我使用这些命令从MacOS机器构建二进制文件:

GOOS=darwin go build
GOOS=windows go build

调用fmt.Scanf("%s", &roleName)在读取标记后的第一个空白字符后返回。

Windows的行结束符是rn。fmt。读取r后,Scanf调用返回。n保持不变。之后对scanner.Scan()的调用读取stdin中剩余的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()
…

相关内容

最新更新