当我尝试使用 root 切换时,sudo -i
出现错误/var/tmp/sclDvf3Vx: line 8: -i: command not found
...但是,su -
我将继续使用它。我绝不是 Linux 系统管理员,所以环境对我来说仍然很模糊。我想我的问题是:
- 为什么会抛出错误?
- 这两个命令有什么区别?
- 为什么要使用其中一种而不是另一种?
更新:
我正在使用 CentOS 版本:CentOS 版本 6.6(最终版)
这是要求我运行的一些命令的输出,在下面的评论中。
type sudo
:sudo is /opt/centos/devtoolset-1.1/root/usr/bin/sudo
sudo -V
:/var/tmp/sclIU7gkA: line 8: -V: command not found
grep'^root:' /etc/passwd
:root: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)。