我有一个 bash 脚本,它使用 cli 登录到我的 bitwarden 实例bw
,方式如下:
测试.sh:
#!/usr/bin/sh
set -e -o pipefail
bw logout --quiet || true
BW_CLIENTID=$(cat ./credentials.json | jq -r '.client_id') \
BW_CLIENTSECRET=$(cat ./credentials.json | jq -r '.client_secret') \
bw login --apikey
具有./credentials.json
以下权限:
-rw-r--r-- 1 root root 169 Jun 10 2023 credentials.json
以普通用户身份运行此脚本可以正常工作,但有时我需要以 root 身份运行它,并且我注意到在某些系统上,bw
当仅使用 运行时,该命令无法正确读取内联环境变量sudo
,它仅适用于sudo -E
,因此:
./test.sh # always works
sudo ./test.sh # works on some machines but not others
sudo -E ./test.sh # always works
当它工作时我得到输出:
You are logged in!
如果没有的话我得到:
client_id or client_secret is incorrect. Try again.
我说“正确”是因为它似乎正在以某种方式读取变量,因为如果我删除其中一个环境变量,如下所示:
BW_CLIENTID=$(cat /mnt/keys/vaultwarden.json | jq -r '.client_id') \
bw login --apikey
相反,系统会提示我输入客户端密钥(或者,如果我删除,则提示输入客户端 ID BW_CLIENTID
)。因此,出于某种原因,如果没有该选项,环境变量中的值就无法正确读取-E
,但它们似乎存在。
我尝试按以下方式使用通用脚本创建测试:
foo.sh:
#!/usr/bin/sh
set -e
FOO=$(cat ./data.json | jq -r '.my_prop') \
BAR=$(cat ./data.json | jq -r '.other_prop') \
./bar.sh
bar.sh:
#!/usr/bin/sh
set -e
echo "foo: '$FOO'"
echo "bar: '$BAR'"
但是,在我的任何系统上运行其中任何一个都可以,所有这些都提供了预期的输出(my_prop
和的other_prop
内容data.json
),并且我没有看到任何一个变体的打印值之间有差异:
./foo.sh
sudo ./foo.sh
sudo -E ./foo.sh
我已经在少数系统上进行了测试,这些系统是 Ubuntu 和 Arch 系统的混合,到目前为止,它-E
在所有 Ubuntu 和一些 Arch 系统上都失败了,但-E
在单个 Arch 系统上却可以运行。
我的主要问题是:是否有办法sudo
配置为始终运行-E
或类似的东西?以及使用该选项时格式是否有差异-E
?(凭证可能有一些奇怪的字符,但我不明白为什么该-E
选项会有所不同)
我看到该/etc/sudoers
文件允许您执行类似以下操作:
Defaults env_keep += "HOME"
但是所有这些行在所有文件中都被注释掉了/etc/sudoers
(因此在所有系统上,包括工作系统),并且没有其他文件/etc/sudoers.d/
。 我也尝试添加BW_CLIENTID
和BW_CLIENTSECRET
类似的东西,但没有效果:
Defaults env_keep += "BW_CLIENTID"
Defaults env_keep += "BW_CLIENTSECRETS
但也许还有其他地方或设置?
附注:我认为这可能只是 CLI 中的一些怪癖
bw
,导致它无法在某些系统上正确获取环境变量,-E
但我想知道是否有我可以开始在自己的系统上查看的设置。不过,我也对有关此的任何提示感兴趣。