【问题标题】:How to check if command exists for a user?如何检查用户的命令是否存在?
【发布时间】:2018-05-20 17:07:50
【问题描述】:

我为一个用户(不是系统范围)安装了 Pip,我想在我使用 sudo 运行的脚本中检查是否为该用户安装了 pip:sudo ./script.sh

我知道使用command -v pip3 来检查命令,当我以用户身份在 shell 中输入它时,它会起作用。

但是如何在我的脚本中检查它?

command -v pip3 退出代码为 1,因为我是 root(因为 sudo)。

su -c "command -v pip3" "$SUDO_USER" 的退出代码为 1。

sudo -u "$SUDO_USER" command -v pip3 说“命令:找不到命令”

【问题讨论】:

标签: bash shell


【解决方案1】:

最简单的是

sudo -u "$SUDO_USER" -i command -v pip3

-i 选项使sudo 使用其-c 选项将提供的命令行传递给用户配置的shell,而不是尝试直接执行命令。这是必要的,因为command 是一个内置的shell;它不作为独立的可执行文件存在。 (-i 选项运行“登录”shell。还有 -s 选项运行非登录 shell。见下文。)

如果你想明确指定一个 shell,你可以这样做:

sudo -u "$SUDO_USER" /bin/sh -lc "command -v pip3"

再次,强制登录 shell,这里使用 -l 选项。

作为一项安全功能,sudo 通常会在执行 shell(或单个命令)之前将$PATH 重置为“安全”值。该值不会有在/etc/profile~/.profile 启动脚本中所做的任何修改,并且如果没有这些修改——将一个或多个用户特定目录添加到路径中——shell 将找不到诸如pip3 已为个人用户安装。

【讨论】:

  • 这个-s 选项看起来很有希望,但不起作用。返回的退出代码是 1。
  • @Stephane:我希望这次我做对了。您必须使用-i,而不是-s,以便运行登录shell。 (或者-lc,如果你正在调用一个特定的shell。)我做了一个测试,我认为它尽可能接近你正在做的事情,它似乎工作。
  • -i 选项有效! echo $? 这次返回 0。感谢您的帮助 rici。
【解决方案2】:

通过将 $USER 替换为特定用户名来使用以下命令。

sudo -H -u $USER bash -c 'command -v pip3'

同样,您可以以其他用户身份运行任何命令

语法:sudo -H -u $USER bash -c 'INSERT_COMMAND_HERE'

【讨论】:

  • 不起作用。 'command -v pip3' 的退出代码为 1(应为 0)。只有'pip3',它表示找不到 pip3。
猜你喜欢
  • 2015-04-07
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 2016-04-15
  • 2011-09-07
  • 2018-07-26
相关资源
最近更新 更多