1. 程式人生 > >如何在非root狀態下用root身份執行命令

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

用非root身份執行X

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

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

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

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

su和su -

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

[[email protected] wstearns]$ tcpdump -i ppp0 -qtn
tcpdump: socket: Operation not permitted

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

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

[[email protected] wstearns]$ tcpdump -i ppp0 -qtn
tcpdump: socket: Operation not permitted
[[email protected] wstearns]$ su - Password: < 輸入root的密碼 >
[[email protected] /root]# tcpdump -i ppp0 -qt
User level filter, protocol ALL, datagram packet socket
tcpdump: 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
[[email protected] /root]# exit
[[email protected] wstearns]$

  哦,原來是我自己下載檔案佔用了撥號線路。呵呵。

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

[[email protected] wstearns]$ su
Password: < 輸入root的密碼 >
[[email protected] wstearns]# tcpdump -i ppp0 -qt
bash: tcpdump: command not found
[[email protected] wstearns]# exit
[[email protected] wstearns]$

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

su - -c <命令>

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

[[email protected] wstearns]$ whoami
wstearns
[[email protected] wstearns]$ su - -c whoami
Password: < 輸入root的密碼 >
root
[[email protected] wstearns]$

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

sudo

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

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

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

[[email protected] updates-sparrow]$ rpm -Uvh cyrus-sasl-1.5.24-11.i386.rpm
cannot 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
[[email protected] updates-sparrow]$

  rpm說不能開啟資料庫,所以不能安裝新軟體。

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

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

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

[[email protected] updates-sparrow]$ sudo rpm --erase cyrus-sasl
[[email protected] 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.rpm
Oct 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 specification
root  ALL=(ALL) ALL wstearns ALL=(root) /bin/rpm,/bin/umount

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

[[email protected] wstearns]$ sudo mcedit test
Sorry, user wstearns is not allowed to execute '/usr/bin/mcedit test' as root on sparrow.
[[email protected] 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
[[email protected] 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:

[[email protected] wstearns]$ vlock -a
The 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的密碼 >
[[email protected] wstearns]$

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

  注意該操作要在控制檯進行,-a選項不能在xterm下使用。請檢視man vlock瞭解更多資訊。

 

相關推薦

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

用非root身份執行X   大多數人犯下的第一個錯誤是:一開始就以root身份執行X,無意中一切都變得非常簡單——能夠直接訪問到所有的檔案,系統管理任務可以輕鬆地搞定,能夠安裝新的軟體,等等。   問題在於有許多程式是不應該用root身份執行的。如果你用自己的身份(非root

如何在DOS以管理員身份執行命令

管理員 info -s ont window 命令 com 管理 轉換 原創 普通User的DOS窗口: 以管理員身份運行的DOS窗口: 轉換(Windows10系統下): 13:11:55 2018-10-18如何在DOS下以管理員身份執行命令?

Linuxroot許可權新增使用者,並給使用者或使用者組指定目錄的讀寫許可權(比如:tomcat檔案的讀寫許可權,可以用於新使用者部署專案)

目的: 在linux環境中為了安全起見,不能讓所有專案都用root部署(防止root許可權過大,對重要檔案的誤操作),所以新加使用者或使用者組,對新使用者或使用者組授予部分檔案操作的許可權。 1.建立使用者newuser,並設定密碼(預設連帶建立newuser組) # useradd n

sudo以root身份執行命令與su切換使用者命令

sudo命令用來以其他身份來執行命令,預設的身份為root。在/etc/sudoers中設定了可執行sudo指令的使用者。若其未經授權的使用者企圖使用sudo,則會發出警告的郵件給管理員。使用者使用sudo時,必須先輸入密碼,之後有5分鐘的有效期限,超過期限則必須重新輸入密

Jedis獲取redis連線(叢集和叢集狀態)

第一:非叢集狀態下 非叢集狀態下用Jedis獲取redis連線,得到Jedis物件即可,一共有兩種: 1.利用Jedis構造器,僅限用於測試,在實際專案中肯定是用JedisPool。   Jedis(String host);   Jedis(String host , i

ubunturoot許可權anaconda2從原始碼編譯並安裝caffe2 採坑日記!

相信做目標檢測的同學都知道facebook已經開源了一個整合很多先進目標檢測演算法的庫,但是官網教程主要針對採用ubuntu系統python來編譯安裝caffe2,由於採用深度學習伺服器沒有sudo許可權,我花費了一天半安裝GPU版的caffe2,最多的錯誤就是

cxgrid 編輯狀態復制當前列的值 真折騰人

text color focus RoCE ont pro tableview bin 版本問題 1、自帶的CTRL +C 只能復制整行,不知是不是版本問題。 2、有分組這個代碼就不行了 s:= G1DBView.DataController.Values[G1DBVie

在ubuntumono-service執行SuperSocket

  最近用開源的SuperSocket 開發了服務端。當要在mono下執行時遇到很多比較麻煩的事讓我走了不少彎路。現在將解決的方法寫出來與大家一起分享,如有不足的地方請告之小白。   下載江大的SuperSocket上面已經自帶了   檔案:      在Config檔案裡面檢查下是否存在log4ne

Win7 以管理員身份執行批處理檔案,切換JDK版本

Win7下 切換JDK的批處理命令 1. 批處理檔案(必須以管理員身份執行)內容如下 @echo off rem --- Base Config 配置JDK的安裝目錄 --- :init set JAVA_HOME_1_8=C:\Program Files\Java\jdk1.8 set JAVA_HO

linuxcron定時執行任務的方法

名稱 : crontab 使用許可權 : 所有使用者 使用方式 : crontab file [-u user]-用指定的檔案替代目前的crontab。 crontab-[-u user]-用標準輸入替代目前的crontab. crontab-1[user]-列出

【完】解決IE10只能管理員身份執行

不知道大家有沒有遇到這種情況,在毫不知情的情況下 IE10 突然打不開了,必須要用管理員身份執行才可以開啟,而且重置瀏覽器這個方法也不奏效~ 今天清楓也遇到了,上網查詢發現是登錄檔許可權的問題,  原因尚不明確,安裝了某些軟體(如 EditPlus )會導致這類問題 ,按照如

自動管理員身份執行bat

將以下程式碼加在開頭 第一種: @echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if '%errorlevel%'

oracleSYSDBA身份登入能檢視同一個賬戶Normal身份登陸建立的表等,而normal身份卻不行?

今天我先用normal,身份登陸建立了一些表和資料等 然後再tables下重新整理並沒有顯示錶, 又用sysdba身份登陸,卻能檢視到這些建立的內容。 什麼問題? 由於沒有找到合適的答案,我就通過cmd 的sqlplus的方式來匯入; 然後依次執行命令,每次執行完之後,

Linuxls和du命令檢視檔案以及資料夾大小 (轉載)

ls的用法 ls -l |grep "^-"|wc -l或find ./company -type f | wc -l  檢視某資料夾下檔案的個數,包括子資料夾裡的。 ls -lR|grep "^-"|wc -l   檢視某資料夾下資料夾的個數,包括子資料夾裡的

0 LinuxJava使用ProcessBuilder執行命令與直接Bash執行命令之間的不同(環境變數方面)

0 問題發生 xiaojietest.java package tasks; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter;

Linuxls和du命令檢視檔案以及資料夾大小

ls -l |grep "^-"|wc -l或find ./company -type f | wc -l  檢視某資料夾下檔案的個數,包括子資料夾裡的。 ls -lR|grep "^-"|wc -l   檢視某資料夾下資料夾的個數,包括子資料夾裡的。 ls -lR|grep "^d"|wc -l  說明:

Linux系統常見的Xshell執行命令——Xshell入門必看

  最近接觸到了Xshell這個軟體,使用這個軟體我們來進行連線Linux系統,進去之後我們可能會兩眼一抹黑,小編就帶大家來學些常見的shell命令。   首先我們要跟大家從最簡單的聊起,我們進入Xs

ubuntu 使用crontab自動執行命令

環境 ubuntu 16.04 一.新增任務 crontab -e 輸入一行命令,用於每一分鐘向a.txt裡面增加一行文字"a" * * * * * echo a >> /a.txt crontab檔案的基本格式如下所示 *     *    *     *   

ubuntujava程式碼呼叫命令將java格式檔案轉換為html格式檔案

import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.File; import java.io.*; public class C

root戶ssh 執行 sudo遠程機器免密鑰

MF nop dde color 文件 必須 ssh 操作 dup   非root用戶ssh 執行 sudo遠程機器免密鑰 # 1、登陸192.168.1.10 ssh-keygen -t rsa # 一路回車 # 將公鑰添加到認證文件中 cat ~/.ssh/id