执行 sudo -u db2inst -sh "db2" 时可以获得正确的 $PATH 吗?

执行 sudo -u db2inst -sh "db2" 时可以获得正确的 $PATH 吗?

我需要运行sudo -u db2inst1 sh -c "db2 connect to db; db2 set schema Edumate; db2 \"select * from edumate_settings\"",但我不想指定 db2 的绝对路径

如果我跑sudo -u db2inst1 sh -c "id;$PATH;ls /opt/ibm/db2/V9.7/bin/db2"

我得到正确的 $PATH/opt/ibm/db2/V9.7/bin/存在的位置

uid=1002(db2inst1) gid=107(db2iadm1) groups=16(dialout),33(video),107(db2iadm1),108(db2fadm1),1001(eduserver)
sh: /sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin:/opt/firebird/bin:/opt/ibm/db2/V9.7/bin/:/opt/eduserver/bin: No such file or directory
/opt/ibm/db2/V9.7/bin/db2

但如果我跑步sudo -u db2inst1 sh -c "db2"我会得到sh: db2: command not found

如果我使用绝对路径(我不想使用绝对路径,以防它被更改),我会收到 db2 提示。

任何建议如何仅db2在此命令中调用sudo -u db2inst1 sh -c "db2 connect to db; db2 set schema Edumate; db2 \"select * from edumate_settings\""

答案1

在大多数配置中, sudo 将PATH环境变量替换为编译时默认值或/etc/sudoers.

您可以在将命令传递给 之前进行路径查找sudo

db2=$(unset -f db2; unalias db2 2>/dev/null; command -v db2)
sudo -u db2inst1 sh -c '"$0" connect to db; "$0" set …' "$db2"

在常见情况下,当您知道该命令不是当前 shell 中的函数也不是别名并且完整路径不包含任何特殊字符时:

sudo -u db2inst1 sh -c "$(command -v db2) connect to db; $(command -v db2) set …"

请注意此处使用双引号,以便$(command -v db2)在外壳中对其进行评估。您可以在标准输入上提供命令以节省更多输入:

sudo -u db2inst1 $(command -v db2) <<\EOF
connect to db
set …
EOF

相关内容