在經歷了這次磨難之後,我是否在使用 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
前綴的命令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
兩者
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
以確定哪些變數將以這種方式導出。