bash子shell导出变量

bash子shell导出变量

如果这是一个不必要的问题,我很抱歉,但我已经在互联网上进行了搜索,不幸的是,该命令对于我的关系来说相当复杂。

我正在尝试将密码通过管道传输到 sudo 命令中,以便以 root 权限执行命令:

 echo 'PASSWORD' | sudo -S [...]

这对我有用。

但是,一旦我需要包含自己的管道的命令的根权限,我就会遇到麻烦:

 echo 'PASSWORD' | sudo -S printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat /dev/sd* -

因此我尝试使用子shell命令:

echo 'PASSWORD' | sudo -S bash -c 'printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat /dev/sd* -'

不幸的是,不能使用引号,因为它们与 printf 命令中的引号冲突。

为了解决这个问题,我尝试了几个括号。这个有效:

echo 'PASSWORD' | sudo -S bash -c '(printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat /dev/sd* -)'

但如果我想使用以前创建的变量,我什至会在导出它们时遇到麻烦:

 export storage="/dev/sda"
 echo 'PASSWORD' | sudo -S bash -c '(printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat $storage -)'

 ERROR: Device - doesn't exist or access denied.

有没有简单的方法来解决这个问题?

答案1

变量不会用单引号展开。

sudo -S bash -c '(printf '%s' "OTHER_PASSWORD" | ... luksFormat $storage -)'
                                                                ~~~~~~~~

请注意,周围的引号%s实际上意味着该字符串未加引号(正如此处突出显示的语法所示),但幸运的是,这并不重要,因为%s没有特殊含义。

相关内容