gpt4 book ai didi

bash - 当命令具有变量赋值时,为什么 sudo 会这样,我该怎么办?

转载 作者:太空宇宙 更新时间:2023-11-03 17:18:08 24 4
gpt4 key购买 nike

我正在调试一个 bash 脚本,我已将我的问题归结为这个非常简单的脚本。它在 CentOS 5.7 中运行:

# tmp.sh
function do_as_someuser {
sudo -u someuser -i "$1"
}

do_as_someuser "ls -l" # line 1
#do_as_someuser "A=1 ls -l" # line 2

当我执行此脚本时,仅取消注释第 1 行,它会按预期显示 someuser 的主目录列表:

[root@centos57 test]# ./tmp.sh 
total 4
drwxr-xr-x 4 someuser someuser 4096 Mar 14 23:36 some_dir
[root@centos57 test]#

但是当我只取消注释第 2 行时,它会将我记录为 someuser 并且不会返回到我的用户提示符,这绝对不是我所期望的。到底为什么定义一个变量会有所不同?

[root@centos57 test]# ./tmp.sh 
[someuser@centos57 ~]$

A=1 ls -l 当我直接在命令行中编写时,它运行得非常好。如果这是一个有效的命令,我当然应该能够执行它,将它作为参数传递给 sudo,不是吗?

我的问题:

  • 为什么会这样?
  • 如何修改 do_as_someuser 以便它执行具有变量赋值的命令?

最佳答案

认为正在发生的事情是 sudo 本身将“var=value”形式解释为环境变量赋值,而不是仅仅将其传递给 shell .就 sudo 而言,您正在分配 A 以具有值 1 ls -l 然后不运行命令。例如,这是一个快速的控制台 session :

$ sudo -i "X=5 ls"
root# echo $X
5 ls

根据快速测试,您可以通过在要运行的命令之前立即使用 -- 选项来避免此问题:

$ sudo -i -- "X=5 ls"
... files ...
$ sudo -i -- 'BLORT=zorch env' | grep BLORT
BLORT=zorch
SUDO_COMMAND=/bin/sh -c BLORT=zorch env

关于bash - 当命令具有变量赋值时,为什么 sudo 会这样,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15421840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com