Debian实例上gcloud ssh执行命令时$(lsb_release -cs)结果不一致
问题:Debian计算引擎实例上gcloud ssh命令返回异常版本信息
问题现象
在Debian实例上执行lsb_release -cs时出现结果不一致的情况:
$ gcloud compute ssh instance-1 --command "lsb_release -cs" bullseye $ gcloud compute ssh instance-1 --command "echo $(lsb_release -cs)" focal $ gcloud compute ssh instance-1 user@instance-1:~$ lsb_release -cs bullseye user@instance-1:~$ echo $(lsb_release -cs) bullseye
仅通过gcloud compute ssh --command执行echo $(lsb_release -cs)时返回focal,其余场景均返回Debian 11的代号bullseye。
原因分析
核心是本地Shell提前解析了命令替换:
- 当你在本地终端执行
gcloud compute ssh instance-1 --command "echo $(lsb_release -cs)"时,本地的bash会优先解析$(lsb_release -cs),在本地机器上运行该命令得到focal(说明你的本地环境是Ubuntu 20.04)。 - 解析完成后,实际传给远程Debian实例的命令变成了
echo focal,因此远程执行后返回focal。 - 其他场景中,
lsb_release -cs都是直接在远程Debian实例上运行,自然返回对应系统的代号bullseye。
解决方法
要让命令替换在远程实例上执行,需阻止本地Shell解析$(...),两种可行方式:
- 用单引号包裹整个命令:
gcloud compute ssh instance-1 --command 'echo $(lsb_release -cs)' - 对美元符号
$进行转义:gcloud compute ssh instance-1 --command "echo \$(lsb_release -cs)"
内容的提问来源于stack exchange,提问作者Gillespie
相关产品推荐
相关产品推荐

