shellwhale
shellwhale

Reputation: 902

How to pass options as a map?

I came across this bash script and I need to do the same thing in PowerShell.

vault write ssh-client-signer/roles/my-role -<<"EOH"
{
  "allow_user_certificates": true,
  "allowed_users": "*",
  "default_extensions": [
    {
      "permit-pty": ""
    }
  ],
  "key_type": "ca",
  "default_user": "ubuntu",
  "ttl": "30m0s"
}
EOH

I tried using a multiline string like so :

vault write ssh-client-signer/roles/my-role -@"
{
  "allow_user_certificates": true,
  "allowed_users": "*",
  "default_extensions": [
    {
      "permit-pty": ""
    }
  ],
  "key_type": "ca",
  "default_user": "ubuntu",
  "ttl": "30m0s"
}
"@

But the command doesn't parse the option correctly.

Failed to parse K=V data: invalid key/value pair "-@\n{\n  allow_user_certificates: true,\n  allowed_users: *,\n  default_extensions: [\n    {\n      permit-pty: \n": format must be key=value

I found a way to run my command with PowerShell by asking vault to read options from a JSON file.

vault write ssh/roles/my-role "@my-role.json";

But that does not answer the original question.

Upvotes: 0

Views: 1024

Answers (2)

Dabombber
Dabombber

Reputation: 466

You're misunderstanding how the Bash example works, the actual command executed is

vault write ssh-client-signer/roles/my-role -

where the - is to read the value from stdin, and the <<"EOH" is the start of a heredoc.

For the PowerShell version, you're attempting to use a herestring (different from a heredoc), but because of the - it's being interpreted as a bare string. Since PowerShell lacks input redirection, an equivalent command might be

@"
{
  "allow_user_certificates": true,
  "allowed_users": "*",
  "default_extensions": [
    {
      "permit-pty": ""
    }
  ],
  "key_type": "ca",
  "default_user": "ubuntu",
  "ttl": "30m0s"
}
"@ | vault write ssh-client-signer/roles/my-role -

Depending on how vault handles data it might also be possible to pass it directly as an argument

vault write ssh-client-signer/roles/my-role @"
{
  "allow_user_certificates": true,
  "allowed_users": "*",
  "default_extensions": [
    {
      "permit-pty": ""
    }
  ],
  "key_type": "ca",
  "default_user": "ubuntu",
  "ttl": "30m0s"
}
"@

Upvotes: 1

js2010
js2010

Reputation: 27516

Here's the output from echoargs. It doesn't seem workable this way.

echoargs -@"
{
  "allow_user_certificates": true,
  "allowed_users": "*",
  "default_extensions": [
    {
      "permit-pty": ""
    }
  ],
  "key_type": "ca",
  "default_user": "ubuntu",
  "ttl": "30m0s"
}
"@


Arg 0 is <-@
{
  allow_user_certificates: true,
  allowed_users: *,
  default_extensions: [
    {
      permit-pty:
>
Arg 1 is <}
>
Arg 2 is <],
>
Arg 3 is <key_type:>
Arg 4 is <ca,
>
Arg 5 is <default_user:>
Arg 6 is <ubuntu,
>
Arg 7 is <ttl:>
Arg 8 is <30m0s
}
@>

You might have to backslash all the quotes, if you want to go through the trouble. If you can't pipe the json to it.

$myarg = @"
{
  "allow_user_certificates": true,
  "allowed_users": "*",
  "default_extensions": [
    {
      "permit-pty": ""
    }
  ],
  "key_type": "ca",
  "default_user": "ubuntu",
  "ttl": "30m0s"
}
"@ -replace '"','\"'


echoargs -$myarg

Arg 0 is <-{
  "allow_user_certificates": true,
  "allowed_users": "*",
  "default_extensions": [
    {
      "permit-pty": ""
    }
  ],
  "key_type": "ca",
  "default_user": "ubuntu",
  "ttl": "30m0s"
}>

Upvotes: 1

Related Questions