2012-07-31 171 views
1

問題將是使用sudo運行命令並進入根(sudo -i)並運行命令

運行這兩個命令的區別究竟是什麼。

作爲根,我做了一個自定義env。可變

export A="abcdef" 

然後在根shell

sudo -i 
echo $A 

回報

abcdef (as expected) 

然而,當我回到正常用戶和運行

sudo -i echo $A 

返回空行。

所以當你運行sudo echo $ A命令時,它是否使用普通用戶的環境變量和shell?

有沒有辦法讓abcdef即使我運行sudo echo $ A?

感謝


編輯1

當你說你已經做出了變量A爲根,我假設你的意思是你在根目錄的.profile或類似的東西,這樣做。 - >


EDIT 2

這是非常合情合理的 但遇到了一些麻煩(是的!)。

當我做

sudo -i 'echo $A' 

我得到
-bash:回聲$ A:沒有找到命令。

然而,當我做

su -c 'echo $A' 

它還給

abcdef 

什麼是錯的

sudo -i 'echo $A' 

命令?

回答

0

雖然我無法在我的機器上覆制結果,但man page for sudo指定-i選項將取消設置/刪除一些變量。

man sudo 

-i [命令]

的-i(模擬初始登錄)選項運行在目標用戶的 的passwd(5)項作爲登錄shell指定的殼。這意味着, 特定登錄的資源文件,如.profile或.login文件將由外殼讀取 。如果指定了一個命令,則將其傳遞到外殼以執行 。否則,執行交互式shell。 sudo嘗試 在運行shell之前更改爲該用戶的主目錄。它 還初始化環境,讓DISPLAY和TERM不變, 設置HOME,MAIL,SHELL,USER,LOGNAME,和路徑,以及 在Linux和AIX系統的/ etc /環境的內容。 所有其他 環境變量被刪除。

所以我會嘗試沒有-i選項。

2

如果你想你的環境傳給sudo,使用sudo -E

-E The -E (preserve environment) option indicates to the 
     security policy that the user wishes to preserve their 
     existing environment variables. The security policy may 
     return an error if the -E option is specified and the user 
     does not have permission to preserve the environment. 

環境被保留兩者交互,並通過任何你在命令行中運行。

+0

先生,你不知道有多少你的評論已幫助可憐的老人! :P +10 – 2013-12-11 12:59:53

2

當你說你已經取得了可變A爲根,我假設你的意思是你在根目錄的.profile或類似的東西,這樣做。我假設你的意思是普通用戶沒有設置A。在這種情況下,以下情況適用:

當您運行命令sudo -i echo $A時,首先由本地shell解釋並用$A代替。這導致sudo -i echo,這是實際執行。

你是什麼意思是這樣的:

sudo -i 'echo $A' 

這傳遞echo $A到sudo的外殼。

~ rnapier$ sudo -i echo $USER 
rnapier 
~ rnapier$ sudo -i 'echo $USER' 
root 

試試這個語法:

sudo -i echo '$USER' 
+0

是的,你的假設是正確的,但仍有問題。請參閱編輯。謝謝。 – user1566629 2012-07-31 21:00:14

+0

語法sudo -i echo'$ USER'返回$ USER。這只是非root用戶完成的。 – user1566629 2012-07-31 22:10:49

+0

如果我嘗試sudo -i回顯「$ USER」,那麼它會返回huser,這是我擁有的非root用戶(就像那裏的rapier一樣) – user1566629 2012-07-31 22:12:57