歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

如何在非root狀態下用root身份執行命令

    用非root身份運行X

  大多數人犯下的第一個錯誤是:一開始就以root身份運行X,無意中一切都變得非常簡單——能夠直接訪問到所有的文件,系統管理任務可以輕松地搞定,能夠安裝新的軟件,等等。

  問題在於有許多程序是不應該用root身份運行的。如果你用自己的身份(非root身份)啟動文件管理器,然後刪除/home,你會丟失自己的所有文件,然後一邊尋找備份文件一邊不停地抱怨自己。萬幸的是所有其他用戶的文件都還安然無恙。但是,如果你用root來做同樣的事情,馬上就會陷入眾人的抱怨和詛咒之中。

  文件共享程序也同樣不應該用root身份運行。如果有人找出了Irc或者Gnutella程序的漏洞,他們最多只能偷竊你自己的文件。但如果你用root來運行這些程序,所有用戶的文件將完全暴露在他們的眼前,包括最最重要的/etc/shadow密碼文件,以及你同事的私人郵件。這可不是什麼好事。

  所以,請務必用你自己的帳號來運行X,用本文下面介紹的方法來運行那些必須使用root才能運行的任務。

su和su -

  假設有人占據了撥號線路,我們想知道那個家伙到底是誰。tcpdump會顯示出線路上的數據包傳輸情況,我們來試試下面這個命令:

[wstearns@sparrow wstearns]$ tcpdump -i ppp0 -qtntcpdump: socket: Operation not permitted

  哦,對了。這個shell和所有其他X下的程序一樣,都用wstearns運行。你會想我可以從命令行提示看出來,不是嗎?:-)

  不過,我可不想只為了一個命令從X完全退出。su命令讓我們用另外一個用戶臨時地替代當前用戶。如果不指定自己想成為哪一個用戶,則su默認我們想成為root。不要嚇起哄說什麼黑客技術,除非當前用戶就是root,否則還是老老實實給su提供目標用戶的密碼。:-)

[wstearns@sparrow wstearns]$ tcpdump -i ppp0 -qtntcpdump: socket: Operation not permitted[wstearns@sparrow wstearns]$ su - PassWord: < 輸入root的密碼 >[root@sparrow /root]# tcpdump -i ppp0 -qtUser level filter, protocol ALL, datagram packet sockettcpdump: listening on ppp0< reflectix.xs4all.nl.29788 > ME.33085: tcp 1448 (DF) [tos 0x10]> ME.33085 > reflectix.xs4all.nl.29788: tcp 0 (DF)< reflectix.xs4all.nl.29788 > ME.33085: tcp 1448 (DF) [tos 0x10]> ME.33085 > reflectix.xs4all.nl.29788: tcp 0 (DF)< reflectix.xs4all.nl.29788 > ME.33085: tcp 1448 (DF) [tos 0x10]> ME.33085 > reflectix.xs4all.nl.29788: tcp 0 (DF)< reflectix.xs4all.nl.29788 > ME.33085: tcp 1448 (DF) [tos 0x10]

7 packets received by filter[root@sparrow /root]# exit[wstearns@sparrow wstearns]$

  哦,原來是我自己下載文件占用了撥號線路。呵呵。

  你或許已經注意到,上面這個例子使用的是su -而不是su。“-”將提供目標用戶的環境來替代當前用戶的環境。下面這個例子很明確地說明了這一點,不用su -時shell不能在/sbin和/usr/sbin下找到我們要執行的命令:

[wstearns@sparrow wstearns]$ suPassword: < 輸入root的密碼 >[root@sparrow wstearns]# tcpdump -i ppp0 -qtbash: tcpdump: command not found[root@sparrow wstearns]# exit[wstearns@sparrow wstearns]$

  在這個例子中,我仍舊留在當前的wstearns目錄,沒有進入root的默認目錄。另外,由於/usr/sbin不在我的路徑中,我得指定tcpdump的完整路徑。這樣看來,一般情況下還是使用“su -”更方便一點。

su - -c <命令>

  如果你確實只需執行一個命令,下面還有一種更快的方法。-c選項告訴su運行指定的命令然後立即返回到原來的用戶:

[wstearns@sparrow wstearns]$ whoamiwstearns[wstearns@sparrow wstearns]$ su - -c whoamiPassword: < 輸入root的密碼 >root[wstearns@sparrow wstearns]$

  su的man文檔有關於該命令及其命令行選項的更多說明。

sudo

  上面的su命令也有缺點,這就是我們必須在每次運行某個命令的時候輸入一下密碼。更糟糕的是,要輸入的密碼還是root的密碼!

  如果要為級別較低的管理員授權,比如授予他們在系統中增加新用戶的權限,應該怎麼辦?你可以讓他們使用su,但如果你把root的密碼也給了他們,他們馬上就是高級管理員了。:-(

  sudo不僅解決了這個問題,而且還提供更多的功能。下面我們要在系統上安裝一個新的rpm:

[wstearns@sparrow updates-sparrow]$ rpm -Uvh cyrus-sasl-1.5.24-11.i386.rpmcannot open Packages index using db3 - Permission denied (13)

-- >The rpm database cannot be opened in db3 format.  If you have just upgraded the rpm package you need to convert  your database to db3 format by running "rpm --rebuilddb" as root.

error: cannot open Packages database in /var/lib/rpm[wstearns@sparrow updates-sparrow]$

  rpm說不能打開數據庫,所以不能安裝新軟件。

[wstearns@sparrow updates-sparrow]$ sudo rpm -Uvh cyrus-sasl-1.5.24-11.i386.rpmPassword: < 輸入wstearns的密碼 >cyrus-sasl       ##################################################[wstearns@sparrow updates-sparrow]$

  這看起來有點象su - -c,是吧?我在sudo命令中指定了要它執行的命令,sudo用root身份來執行這個命令。但這裡我只要輸入自己的密碼,而不是root的密碼。從這點來看,sudo是一個比su更有用的工具。

  如果我在5分鐘之內執行另外一個命令,不再需要輸入自己的密碼:

[wstearns@sparrow updates-sparrow]$ sudo rpm --erase cyrus-sasl[wstearns@sparrow updates-sparrow]$

  sudo也把所有的命令記錄到了/var/log/secure:

Oct 29 22:26:49 sparrow sudo: wstearns : TTY=pts/21 ; PWD=/mnt/redhat ; USER=root ; COMMAND=/bin/rpm -Uvh cyrus-sasl-1.5.24-11.i386.rpmOct 29 22:30:03 sparrow sudo: wstearns : TTY=pts/21 ; PWD=/mnt/redhat ; USER=root ; COMMAND=/bin/rpm --erase cyrus-sasl

  在普通用戶能夠使用sudo之前,root必須聲明哪些用戶可以用root身份執行哪些命令。在下面這個例子中,假定root決定允許我安裝新軟件、卸下驅動器。root運行visudo命令編輯/etc/sudoers,修改完成後,visudo將檢查該文件以保證不存在語法錯誤。下面是這個/etc/sudoers文件的內容:

# User privilege specificationroot  ALL=(ALL) ALL wstearns ALL=(root) /bin/rpm,/bin/umount

  如果我試圖執行其他命令,sudo將拒絕執行命令並在/var/log/secure登記我的這一企圖:

[wstearns@sparrow wstearns]$ sudo mcedit testSorry, user wstearns is not allowed to execute '/usr/bin/mcedit test' as root on sparrow.[wstearns@sparrow wstearns]$ su - -c 'tail --lines=1 /var/log/secure'Password: < 輸入root的密碼 >Oct 29 22:46:53 sparrow sudo: wstearns : command not allowed ; TTY=pts/21 ; PWD=/home/wstearns ; USER=root ; COMMAND=/usr/bin/mcedit test[wstearns@sparrow wstearns]$

  授予sudo權限時一定要小心。在上面這個例子中,root授權我安裝和刪除rpm軟件包,此時如果我懷有惡意,就可以用帶有特洛伊木馬/bin/login的軟件包取代系統上的正常軟件包,下次root登錄時,/bin/login就可以把root使用的密碼發送給我。即使只授予某個用戶在sudo下運行less的權限,也使得該用戶能夠從less通過!命令得到root身份的shell。

  在授予任何人通過sudo執行某個命令的權限之前,一定要仔細地考慮一下所有濫用該權限的可能。他們能夠用自己的文件替換/etc/passwd或/etc/shadow嗎?當運行dd、tar、ln和任何文本編輯器的用戶是root時,它們都屬於這類危險的命令。

  和su一樣,請參見sudo、visudo、sudoers的man文檔了解更多信息。

vlock -a

  如果我同時登錄了多個終端,現在想要離開一下去倒杯咖啡,卻又不想從所有終端注銷然後再在幾分鐘後重新登錄,特別當那些終端上運行著程序時更是如此。為此,我可以在某個空閒的終端上運行vlock -a:

[wstearns@sparrow wstearns]$ vlock -aThe entire console display is now completely locked.You will not be able to switch to another virtual console.Please enter the password to unlock.wstearns's Password: < 輸入wstearns的密碼 >[wstearns@sparrow wstearns]$

  vlock並不使我從系統注銷,也不會中止我正在運行的任何程序,它只是不讓用戶再在該終端上輸入任何命令。另外,使用-a選項之後,vlock也禁止用戶在輸入密碼之前切換到其他終端,這就保護了所有其他終端。

  注意該操作要在控制台進行,-a選項不能在xterm下使用。請查看man vlock了解更多信息。




Copyright © Linux教程網 All Rights Reserved