sudo -i 返回错误

sudo -i 返回错误

当我尝试使用 root 切换时,sudo -i出现错误/var/tmp/sclDvf3Vx: line 8: -i: command not found...但是,su -我将继续使用它。我绝不是 Linux 系统管理员,所以环境对我来说仍然很模糊。我想我的问题是:

  1. 为什么会抛出错误?
  2. 这两个命令有什么区别?
  3. 为什么要使用其中一种而不是另一种?

更新:

我正在使用 CentOS 版本:CentOS 版本 6.6(最终版)

这是要求我运行的一些命令的输出,在下面的评论中。

  • type sudosudo is /opt/centos/devtoolset-1.1/root/usr/bin/sudo
  • sudo -V/var/tmp/sclIU7gkA: line 8: -V: command not found
  • grep'^root:' /etc/passwdroot:x:0:0:root:/root:/bin/bash

更新:

不久前,它被添加到我的非 root 用户的 ~/.bashrc 中,因为我需要 C++11 支持。当我将其注释掉并重新 ssh 时,我可以运行 sudo -i ,没有任何错误。

if [ "$(gcc -dumpversion)" != "4.7.2" ]; then 
  scl enable devtoolset-1.1 bash
fi

答案1

从评论和您的进一步调查看来,您的开发工具集正在修改PATH.不幸的是,这包括似乎是旧的或损坏的 sudo 命令。

值得尝试.bashrc像这样修改您的开发工具集,然后再次登录:

if [ "$(gcc -dumpversion)" != "4.7.2" ]; then 
  scl enable devtoolset-1.1 bash
  PATH=/usr/bin:$PATH    # We need a working sudo
fi

答案2

我没有解决 SCL 损坏的 sudo 包装器,而是禁用了它。

echo >> /opt/rh/devtoolset-2/root/usr/bin/sudo
chmod -x /opt/rh/devtoolset-2/root/usr/bin/sudo

在文件末尾添加换行符可确保它不会被后续的 Yum 更新覆盖,然后我只是将其设为不可执行。

我安装了开发工具集以在 RHEL 6 上获取现代版本的 gcc 和 c++,并且在没有混合使用假 sudo 的情况下编译代码没有任何问题。

答案3

sudo -E使用 devtoolset-4 后,我遇到了类似的 flag 问题。在这种情况下,您不应该添加-E标志,因为它是在/opt/rh/devtoolset-4/root/usr/bin/sudo包装脚本中添加的,以下是其内容:

#! /bin/sh
# TODO: parse & pass-through sudo options from $@
sudo_options="-E"

for arg in "$@"
do
   case "$arg" in
    *\'*)
      arg= ;;
   esac
   cmd_options="$cmd_options '$arg'" 
done
exec /usr/bin/sudo $sudo_options LD_LIBRARY_PATH=$LD_LIBRARY_PATH PATH=$PATH scl enable devtoolset-4 "$cmd_options"

答案4

这已报告给 RedHatBZ1319936并在 devtoolset devtoolset-9-9.0-3.el7 中修复(RHEA-2019:4132)。

相关内容