在 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
.