经过这次磨难后我还在使用 bash 吗?

经过这次磨难后我还在使用 bash 吗?

在 Mountain Lion 主机上Coguaro,我coconutpowder使用以下命令以用户身份登录bash

Coguaro:~ coconutpowder$ echo $0
-bash

我需要以提升的权限运行命令,因此我尝试su切换到root但它不允许我:

Coguaro:~ coconutpowder$ su -
Password:
su: Sorry

费够了。我阅读了该man页面su并得到了这个:

PAM is used to set the policy su(1) will use.
In particular, by default only users in the ``admin'' or ``wheel''
groups can switch to UID 0 (``root'').

我注意到我不属于任何一个允许su这样做的群体:

Coguaro:~ coconutpowder$ id
uid=502(coconutpowder) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts)

所以我重新运行su命令,并在其前面加上 a 前缀sudo,我可以按照如下方式执行此操作/etc/sudoers

/etc/sudoers: coconutpowder ALL=(ALL) ALL

Coguaro:~ coconutpowder$ sudo su -
Coguaro:~ root# echo $USER $0 $BASH_VERSION
root -sh 3.2.48(1)-release
Coguaro:~ root# 

现在我遇到了一个我认为有问题的场景,因为我实际上正在运行sh我所看到的内容,这毕竟是我的登录 shell root,但是我BASH_VERSION从之前的登录中设置了环境变量,并通过该机制传递sudo?如果我错了请纠正我。

这意味着一些像这样的 shell 检测技巧会被破坏:

if [ ${BASH_VERSION-not_running_within_bash} = not_running_within_bash ]; then
  # ...
fi

我完全不知道如何正确地su进行root并有某种方法来确定肯定无论我是否使用bash。该脚本广泛使用 Bash 数组,如果某些值出现错误,可能会破坏文件系统路径。我发现ps -p $$其他地方提到的黑客有点黑客(?!)所以我正在寻找完成我想要完成的事情的最佳方法,考虑到我必须首先登录并且coconutpowder不能直接这样做root

如果我错误地进行了用户切换,我相信这个问题与其他仅检测当前(而不是“默认”或者“已分配”) 壳。

到目前为止,我正准备解析 $0,可能会删除任何-表示登录 shell 的前缀字符。

除非你们中的任何人都可以教我如何su登录root(即阅读 $HOME/.profile)并直接bash从默认值切换到默认值sh,这是无法更改的。

答案1

现在我遇到了一个我认为有问题的场景,因为我实际上正在运行 sh 来查看我所看到的内容,毕竟这是我的 root 登录 shell,但是我从之前的登录中设置了 BASH_VERSION 环境变量,并通过 sudo 传递机制?如果我错了请纠正我。

幸运的是,你错了。和类似的环境变量BASH_VERSION, 但不是出口,因此子进程不存在它们。

比较输出:

set | grep ^BASH

env | grep ^BASH

set和都env显示环境变量。 set是一个内置的 shell,它可以看到BASH_*变量。 env是一个外部程序,您会注意到它BASH_*根本看不到变量。

如果你做过想要将这些变量导出到子进程,您可以手动执行,然后它将显示在env

$ export BASH_VERSION
$ env | grep ^BASH
BASH_VERSION=4.2.36(1)-release

但除非您像这样手动导出它们,否则您可以相当确定 的存在BASH_VERSION意味着您实际上正在运行 bash。另请参阅 的输出,export -p了解哪些变量将以这种方式导出。

答案2

是的,你还在使用 bash。BASH_VERSION是一个 shell 变量,而不是环境变量:它仅在该 shell 中定义,不会导出到其他进程。 (看bash中环境变量和导出环境变量的区别shell 变量可以有哪些作用域?)。

由于$0表明-sh,该外壳是登录外壳。它是 bash,但以 bash 名称开始sh。当 bash 作为 启动时sh,它的行为有所不同:它关闭一些特定于 bash 的功能,以便与其他 shell 更加兼容。

不用管su命令。要以 root 身份获取交互式登录 shell,请运行sudo -i.您可以指定要运行的备用 shell,例如sudo -i zsh。要运行保留某些环境变量并且不运行 root.profile或其他登录文件的交互式 shell,请运行sudo -s.

相关内容