Bash

在經歷了這次磨難之後,我是否在使用 bash?

  • September 13, 2012

在 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前綴的命令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為我所看到的而執行,root畢竟這是我的登錄 shell,但是我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直接登錄。

如果我做錯了使用者切換,我相信這個問題與僅檢測目前(不是“預設”“分配”)shell而激增的其他問題截然不同。

到目前為止,我正在逐步解析 $0,可能會刪除任何前綴-字元以表示登錄 shell。

su除非你們中的任何人都可以教我如何root登錄(即閱讀 $HOME/.profile)並直接bash從 default切換到sh,這是無法更改的。

現在我有一個我認為是有問題的場景,因為我實際上正在執行 sh 我可以看到的內容,畢竟這是我的 root 登錄 shell,但是我有 BASH_VERSION 環境變數從我之前的登錄中設置,通過 sudo機制?如果我錯了,請糾正我。

幸運的是,你錯了。和類似的BASH_VERSION環境變數已設置,但未導出,因此子程序不存在它們。

比較以下輸出:

set | grep ^BASH

env | grep ^BASH

兩者setenv顯示環境變數。 set是一個內置的shell,它可以看到BASH_*變數。 env是一個外部程序,你會注意到它根本看不到BASH_*變數。

如果您確實想將這些變數導出到子程序,您可以手動執行,然後它會顯示在env

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

但是除非您像這樣手動導出它們,否則您可以相當確定它的存在BASH_VERSION意味著您實際上正在執行 bash。另請參閱 的輸出export -p以確定哪些變數將以這種方式導出。

引用自:https://unix.stackexchange.com/questions/47901