是否可以使用 HEREDOC 运行 sudo?

是否可以使用 HEREDOC 运行 sudo?

编辑:@Kusalananda 回答后修改示例。我的整个情况更加复杂。我需要多个命令和变量定义)

我无法使用,su因为我不是 root 并且我不想输入密码

我尝试模仿来自同事脚本的 su 代码:

# script runs as root
su - oracle -- "export DATA=$val; cat <<CHK
test 
CHK"
Password:
test

以下不起作用(错误输出):

$ export val=534
$ sudo -i -u oracle -- "export DATA=$val;cat <<CHK
test
CHK"
-ksh: export DATA=534;cat <<CHKtestCHK: not found
[127]$

这都不是(根本没有输出):

$ sudo -i -u oracle -- ksh -c "export DATA=$val;cat <<CHK
test
CHK"
$ 

我明白某种程度上sudo扁平化输入,但是曼须藤仅在参数中提到这一点并用空格分隔,但这里不是这种情况。

答案1

您不需要将此处文档重定向作为您执行的命令的一部分sudo

sudo -u oracle env DATA="$val" cat <<END
this is
the here-document
END

sudo实用程序会将标准输入流传递给它执行的命令。该env工具在执行给定实用程序之前修改环境。如上所示,将其与 一起使用sudo是在要运行的实用程序中设置环境变量的一种方法,sudo即使sudo可能会清除大多数变量的环境。

如果您的命令比设置变量和运行更复杂cat,请考虑收集需要sudo在脚本中执行的操作,然后运行该脚本。

#!/bin/sh

export DATA="something"

cat <<END
this is
the here-document
END

请注意,该字符串something也可以从脚本的命令行中获取。或者,您可以完全省略该语句,而是在执行脚本时如前所示DATA设置:env

sudo env DATA="$var" ./myscript

相关内容