I can use gcloud cloud-shell ssh
to login to Google Cloud Shell.
This, on first use, creates a ~/.ssh/google_compute_engine
(+.pub
).
But I already have existing SSH private key/s, and would much prefer to use those, specifically ed25519-sk
and id_ecdsa_sk
ones backed by a physical YubiKey security key. The gcloud cloud-shell ssh documentation mentions a --ssh-key-file
flag, but it does not appear to work, and prints an ignored explicit argument
error message that is not particularly helpful:
$ gcloud version
Google Cloud SDK 367.0.0
alpha 2021.12.10
beta 2021.12.10
bq 2.0.72
core 2021.12.10
gsutil 5.5
$ gcloud cloud-shell ssh --ssh-key-file=~/.ssh/id_ecdsa_sk
ERROR: (gcloud.cloud-shell.ssh) argument --ssh-key-file: ignored explicit argument '~/.ssh/id_ecdsa_sk'
Usage: gcloud cloud-shell ssh [optional flags]
optional flags may be --authorize-session | --command | --dry-run |
--force-key-file-overwrite | --help | --ssh-flag |
--ssh-key-file
I thought perhaps it doesn't dig SK SSH keys, but even a simple good ol' self created RSA does not appear to work:
$ ssh-keygen
(...)
Your identification has been saved in /home/vorburger/.ssh/id_rsa
Your public key has been saved in /home/vorburger/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:...
$ gcloud --verbosity=debug cloud-shell ssh --ssh-key-file=~/.ssh/id_rsa --verbosity=debug
ERROR: (gcloud.cloud-shell.ssh) argument --ssh-key-file: ignored explicit argument '~/.ssh/id_rsa'
How does ones use gcloud cloud-shell ssh
with existing SSH keys?
This behaviour seems to be a bug in the code of the SDK.
On the file <gcloud path>/lib/googlecloudsdk/command_lib/cloud_shell/util.py
we can see how the --ssh-key-file
argument is parsed:
parser.add_argument(
'--ssh-key-file',
help="""\
The path to the SSH key file. By default, this is
*~/.ssh/google_compute_engine*.
""",
action='store_true')
That parser
comes from the argparse
module.
In the documentation of that module, we can see what store_true
of the action
parameter means:
'store_true'
and'store_false'
- These are special cases of 'store_const' used for storing the values True and False respectively.
--ssh-key-file
should probably be a string, so the way it's programmed, it's going to ignore anything that's not a boolean.
I'm guessing the best option in this situation is to raise a bug in Google's Issue Tracker, since it's a bug on the SDK. I've done just that, and this is the link to the report: https://issuetracker.google.com/216434260
Meanwhile, the workaround would be to replace 'store_true'
by something that should work, like 'store'
:
'store'
- This just stores the argument’s value. This is the default action.
To do so in your local installation of the SDK, simply execute this sed
command:
sed -zi 's/store_true/store/2' $(gcloud info --format 'value(installation.sdk_root)')/lib/googlecloudsdk/command_lib/cloud_shell/util.py