Linux系統(tǒng)下,如何以其他用戶身份運(yùn)行程序
#1:runuser命令
runuser命令使用一個(gè)替代的用戶或者組ID運(yùn)行一個(gè)Shell。這個(gè)命令僅在root用戶時(shí)有用。
僅以會(huì)話PAM鉤子運(yùn)行,并且沒(méi)有密碼提示。如果用一個(gè)非root用戶,并且該用戶沒(méi)有權(quán)限設(shè)置user ID,這個(gè)命令將會(huì)因?yàn)槌绦驔](méi)有setuid
而失敗。因runuser
不會(huì)運(yùn)行認(rèn)證和賬戶PAM鉤子,它比su
更底層。
語(yǔ)法:
- runuser -l userNameHere -c 'command'
- runuser -l userNameHere -c '/path/to/command arg1 arg2'
舉例來(lái)說(shuō),作為一個(gè)root用戶,你也許想檢查下oracle用戶下的shell資源限制,輸入:
- # runuser -l oracle -c 'ulimit -SHa'
或者監(jiān)察下nginx或lighttpd web服務(wù)器限制:
- # runuser -l nginx -c 'ulimit -SHa'
或
- # runuser -l lighttpd -c 'ulimit -SHa'
有時(shí),root用戶由于權(quán)限(安全)問(wèn)題不能瀏覽NFS掛載的共享:
- # ls -l /nfs/wwwroot/cyberciti.biz/http
或者
- # cd /nfs/wwwroot/cyberciti.biz/http
可能的輸出:
- -bash: cd: /nfs/wwwroot/cyberciti.biz/http/: Permission denied
盡管如此,apache用戶被允許瀏覽或訪問(wèn)掛載在/nfs/wwwroot/cyberciti.biz/http/
下基于nfs的系統(tǒng):
- # runuser -l apache -c 'ls -l /nfs/wwwroot/cyberciti.biz/http/'
或者
- # runuser -l apache -c 'cd /nfs/wwwroot/cyberciti.biz/http/; vi index.php'
使用runuser
命令,無(wú)需使用密碼,并且,只能在root用戶下使用。
可用選項(xiàng):
1. -l: 讓shell成為登錄shell,用 runuser -l PAM 文件替代默認(rèn)的
2. -g:指定主要的組
3. -G 追加組
4. -c:命令,要傳到shell的單個(gè)命令
5. --session-command=COMMAND:使用-c傳遞單個(gè)命令道shell中并且不創(chuàng)建新的會(huì)話
6. -m: 不重置環(huán)境變量。
#2:su命令
su命令允許你成為一個(gè)超級(jí)用戶或者替代用戶(substitute user),欺騙用戶(spoof user),設(shè)置用戶(set user)或者切換用戶(switch user)。它允許一個(gè)Linxu用戶切換當(dāng)前用戶到那些你知道密碼的目標(biāo)用戶,切換包括與之關(guān)聯(lián)的運(yùn)行中的控制臺(tái)(console)或者Shell,它的語(yǔ)法如下:
- su -
- su - username
切換到root用戶
su
命令會(huì)詢問(wèn)目標(biāo)用戶的密碼,在你的shell命令行中輸入 su -
來(lái)切換到root用戶(你必須知道root用戶的密碼):
- vivek@wks01:~$ su -
或者
- vivek@wks01:~$ su - root
輸出示例:
- Password:
- root@wks01:/root# logout
- vivek@wks01:~$
如果輸入了正確的root密碼,會(huì)話的所有權(quán)(這里應(yīng)該指當(dāng)前控制臺(tái)的上下文——譯注)將改為root賬戶。輸入logout
可以退出一個(gè)root登錄的shell,輸入 whoami
或者id
命令來(lái)驗(yàn)證當(dāng)前會(huì)話的所有者:
- whoami
用root賬戶運(yùn)行命令
語(yǔ)法是:
- su - root -c "command"
- # OR
- su - -c "command arg1"
查看/root
目錄下的內(nèi)容,這些原本是普通用戶無(wú)法訪問(wèn)的,運(yùn)行:
- su - root -c "ls -l /root"
需要注意的是,Linix和一些Unix-like系統(tǒng)有一個(gè)wheel用戶組,并且只允許這個(gè)組內(nèi)的用戶使用su
切換到root。
使用su
命令來(lái)讓其他用戶運(yùn)行命令
下面這個(gè)命令是切換到oracle的賬戶,并且顯示限制清單:
- $ su - oracle -c 'ulimit -aHS'
同樣, 如果提供了正確的oracle密碼,會(huì)話所有權(quán)將會(huì)變成oracle賬戶。su
命令的日志保存在系統(tǒng)日志中,一般是在/var/log/auth.log
(Debian/Ubuntu)或者/var/log/secure
(RHEL/CentOS)。
#p#
#3:sudo命令
sudo以另外的用戶來(lái)執(zhí)行一個(gè)命令,但是它跟著一組關(guān)于那些用戶可以以那些其他用戶執(zhí)行那些命令的規(guī)則(有點(diǎn)繞口——譯注)。這個(gè)規(guī)則在/etc/sudoers
這個(gè)文件中被定義。不像su
,sudo
驗(yàn)證用戶是靠用戶自己的密碼而不是那個(gè)要切換的用戶密碼。當(dāng)提供一個(gè)審計(jì)跟蹤命令和他們的參數(shù)時(shí)(原文:...whileproviding an audit trail of the commands and their arguments——譯注)sudo
允許一個(gè)系統(tǒng)管理員給某些用戶(或用戶組)委派以root或其他用戶來(lái)運(yùn)行某些(或全部)命令的權(quán)限。這允許無(wú)需在用戶之間共享密碼就可以在指定宿主上將指定命令委派給指定用戶。語(yǔ)法如下:
- sudo command
參照下面的這些鏈接來(lái)獲取更多信息:
1. 在Linux操作系統(tǒng)如何配置和使用sudo
工具1
2. sudo項(xiàng)目主頁(yè)2
GUI工具注意事項(xiàng)(su和sudo的前端GUI)
gksu 命令是su
的前臺(tái),gksudo是sudo
的前端。他們的主要用途是用來(lái)運(yùn)行需要root權(quán)限但不需要運(yùn)行一個(gè)X terminal emulator和使用直接使用su的圖形化命令。語(yǔ)法如下:
- gksu [-u <user>] [options] <command>
- gksudo [-u <user>] [options] <command>
僅輸入gksu
,將會(huì)顯示下面這個(gè)彈窗:
圖1:運(yùn)行中的gksu
然后,你將會(huì)被要求輸入root用戶的密碼:
圖2:Gnome gksu對(duì)目標(biāo)用戶的驗(yàn)證框
你也可以直接運(yùn)行下面代碼:
- gksu -u root 'ls /root'
或,以oracle用戶運(yùn)行命令:
- gksu -u oracle 'ulimit -aHS'
或作為root登錄:
- gksu -u root -l
總結(jié):runuser VS su VS sudo
請(qǐng)查看man
幫助頁(yè)面來(lái)獲取更多關(guān)于su
,sudo
,gksu
,和gksudo
命令的相關(guān)信息。
說(shuō)明:
本文是nixCraft一篇文章的翻譯,非常感謝nixCraft提供如此棒的教程,原文可以通過(guò)參考的原文連接查看,在翻譯中省略了頭尾一些非相關(guān)信息,同時(shí)由于翻譯時(shí)間有限,是通過(guò)邊看邊譯的形式完成此篇博文,錯(cuò)誤肯定非常多,還請(qǐng)大家多多指正。
參考:
1. 在Linux操作系統(tǒng)下如何配置和使用sudo(英文頁(yè)面)
2. sudo項(xiàng)目主頁(yè)(英文頁(yè)面)
3. 本篇博客原文(英文頁(yè)面)