Linux小技巧--指定用戶執行命令

    之前找了一些博客,但是在執行的時候一直報錯,後來參考這篇博客(https://www.cnblogs.com/bodhitree/p/6018369.html)才發現沒有加引號

su 用戶 -c "你要執行的命令"

本文轉載自https://www.cnblogs.com/bodhitree/p/6018369.html

本文綜合分析了Linux系統下,如何使用runuser命令、su命令和sudo命令以其他用戶身份來運行程序,以及這三個命令的運行效率比較。

 

一、su 命令臨時切換用戶身份

SU:( Switch user切換用戶),可讓一個普通用戶切換爲超級用戶或其他用戶,並可臨時擁有所切換用戶的權限,切換時需輸入欲切換用戶的密碼;也可以讓超級用戶切換爲普通用戶,臨時以低權限身份處理事務,切換時無需輸入欲切換用戶的密碼。

在 Linux 系統中,有時候普通用戶有些事情是不能做的,除非是 root 用戶才能做到。這時就需要用 su 命令臨時切換到 root 身份來做事了。

1、su 的語法

su [OPTION選項參數] [用戶]

-, -l, –login

切換用戶時,使環境變量(home,shell,user,logname,path等)和欲切換的用戶相同、不使用則取得用戶的臨時權限,不加載環境變量。用su命令切換用戶後,可以用 exit 命令或快捷鍵[Ctrl+D]可返回原登錄用戶;

-c, –command=COMMAND

使用 -c 傳遞單個命令到 shell 中,執行命令後,就恢復原來的用戶身份,退出所切換到的用戶環境;

–session-command=COMMAND

使用 -c 傳遞單個命令到 shell 中,並且不創建新的會話;

-f, –fast

通過 -f 參數到 shell (針對 csh 或 tcsh);

-m, –preserve-environment

不重置環境變量;

-s, –shell=SHELL

指定執行命令的shell;

–help 

顯示幫助信息;

–version

顯示版本信息;

2、su 的範例:

1
2
3
4
5
su  -
su  - root
su  - root -c  "ls -l /root"
su  - oracle -c  "ulimit -aHS"
su  -s  /bin/sh  -c  "/usr/local/nginx/sbin/nginx"

3、su 的優缺點
su 的確爲管理帶來方便,通過切換到 root 下,能完成所有系統管理工具,只要把 root 的密碼交給任何一個普通用戶,他都能切換到 root 來完成所有的系統管理工作。但通過 su 切換到 root 後,也有不安全因素;比如系統有10個用戶,而且都參與管理。如果這10個用戶都涉及到超級權限的運用,做爲管理員如果想讓其它用戶通過 su 來切換到超級權限的 root,必須把 root 權限密碼都告訴這10個用戶。如果這10個用戶都有 root 權限,通過 root 權限可、以做任何事,這在一定程度上就對系統的安全造成了威協,想想 Windows 吧,簡直就是惡夢。

“沒有不安全的系統,只有不安全的人”,我們絕對不能保證這10個用戶都能按正常操作流程來管理系統,其中任何一人對系統操作的重大失誤,都可能導致系統崩潰或數據損失,所以 su 工具在多人蔘與的系統管理中,並不是最好的選擇,su 只適用於一兩個人蔘與管理的系統,畢竟 su 並不能讓普通用戶受限的使用;超級用戶 root 密碼應該掌握在少數用戶手中,這絕對是真理!所以集權而治的存在還是有一定道理的。

二、sudo 命令
1、sudo 的適用條件
由於su 對切換到超級權限用戶 root 後,權限的無限制性,所以 su 並不能擔任多個管理員所管理的系統。如果用 su 來切換到超級用戶來管理系統,也不能明確哪些工作是由哪個管理員進行的操作。特別是對於服務器的管理有多人蔘與管理時,最好是針對每個管理員的技術特長和管理範圍,並且有針對性的下放給權限,並且約定其使用哪些工具來完成與其相關的工作,這時我們就有必要用到 sudo。通過 sudo,我們能把某些超級權限有針對性的下放,並且不需要普通用戶知道 root 密碼,所以 sudo 相對於權限無限制性的 su 來說,還是比較安全的,所以 sudo 也能被稱爲受限制的 su。另外 sudo 是需要授權許可的,所以也被稱爲授權許可的 su。
sudo 執行命令的流程是當前用戶切換到root(或其它指定切換到的用戶),然後以root(或其它指定的切換到的用戶)身份執行命令,執行完成後,直接退回到當前用戶,而這些的前提是要通過sudo的配置文件/etc/sudoers來進行授權。默認只有 root 用戶能使用 sudo 命令,普通用戶想要使用 sudo,是需要 root 預先設定的,默認 root 能夠 sudo 是因爲這個文件中有一行”root ALL=(ALL) ALL”。

2、sudo 配置文件

我們可以用他的專用編輯工具 visodu ,此工具的好處是在添加規則不太準確時,保存退出時會提示給我們錯誤信息;配置好後,可以用切換到您授權的用戶下,通過sudo -l 來查看哪些命令是可以執行或禁止的。

/etc/sudoers 文件中每行算一個規則,前面帶有 # 號可以當作是說明的內容,並不執行;如果規則很長,一行列不下時,可以用 \ 號來續行,這樣看來一個規則也可以擁有多個行。

/etc/sudoers 的規則可分爲兩類:一類是別名定義,另一類是授權規則;別名定義並不是必須的,但授權規則是必須的。

sudo授權規則(sudoers配置):

1
授權用戶 主機=命令動作

這三個要素缺一不可,但在動作之前也可以指定切換到特定用戶下,在這裏指定切換的用戶要用( )號括起來,如果不需要密碼直接運行命令的,應該加 NOPASSWD: 參數,但這些可以省略。舉例說明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
 
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
 
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
 
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
 
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
 
## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now
 
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

執行visudo之後,可以看見缺省只有一條配置:

root    ALL=(ALL) ALL

那麼你就在下邊再加一條配置:
admin ALL=(ALL) ALL

這樣,普通用戶 admin 就能夠執行 root 權限的所有命令

讓普通用戶support只能在某幾臺服務器上,執行root能執行的某些命令,首先需要配置一些Alias,這樣在下面配置權限時,會方便一些,不用寫大段大段的配置。Alias主要分成4種:
Host_Alias

Cmnd_Alias

User_Alias

Runas_Alias

配置Host_Alias:就是主機的列表

Host_Alias      HOST_FLAG = hostname1, hostname2, hostname3

配置Cmnd_Alias:就是允許執行的命令的列表,命令前加上 ! 表示不能執行此命令。命令一定要使用絕對路徑,避免其他目錄的同名命令被執行,造成安全隱患 ,因此使用的時候也是使用絕對路徑!

Cmnd_Alias      COMMAND_FLAG = command1, command2, command3 ,!command4

配置User_Alias:就是具有sudo權限的用戶的列表

User_Alias USER_FLAG = user1, user2, user3

配置Runas_Alias:就是用戶以什麼身份執行(例如root,或者oracle)的列表

Runas_Alias RUNAS_FLAG = operator1, operator2, operator3

配置權限的格式如下: 

USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG

如果不需要密碼驗證的話,則按照這樣的格式來配置

USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
Host_Alias      EPG = 192.168.1.1, 192.168.1.2
## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem
## Command Aliases
## These are groups of related commands...
Cmnd_Alias      SQUID =  /opt/vtbin/squid_refresh , ! /sbin/service /bin/rm  
Cmnd_Alias      ADMPW =  /usr/bin/passwd  [A-Za-z]*, ! /usr/bin/passwd , ! /usr/bin/passwd  root
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
admin EPG=(ALL) NOPASSWD: SQUID
admin EPG=(ALL) NOPASSWD: ADMPW
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
 
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
 
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
 
## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

當然新用戶的配置也可以放到,/etc/sudoers.d/ 下的文件裏,也會生效,修改也方便。

3、sudo 語法

sudo [ -Vhl LvkKsHPSb ] │ [ -p prompt ] [ -c class│- ] [ -a auth_type ] [-u username│#uid ] command

1

2
3
4
5
6
7
8
9
10
11
-V       顯示版本編號  
-h       會顯示版本編號及指令的使用方式說明
-l       顯示出自己(執行 sudo 的使用者)的權限
-v       因爲 sudo 在第一次執行時或是在 N 分鐘內沒有執行(N 預設爲五)會問密碼,這個參數是重新做一次確認,如果超過 N 分鐘,也會問密碼
-k       將會強迫使用者在下一次執行 sudo 時問密碼(不論有沒有超過 N 分鐘)
-b       將要執行的指令放在背景執行
-p       prompt 可以更改問密碼的提示語,其中 %u 會代換爲使用者的帳號名稱, %h 會顯示主機名稱
-u       username/#uid 不加此參數,代表要以 root 的身份執行指令,而加了此參數,可以以 username 的身份執行指令(#uid 爲該 username 的使用者號碼)
-s       執行環境變數中的 SHELL 所指定的 shell ,或是 /etc/passwd 裏所指定的 shell
-H       將環境變數中的 HOME (家目錄)指定爲要變更身份的使用者家目錄(如不加 -u 參數就是系統管理者 root )
command  要以系統管理者身份(或以 -u 更改爲其他人)執行的指令

三、runuser 命令

runuser命令使用一個替代的用戶或者組ID運行一個Shell。這個命令僅在root用戶時有用。
僅以會話PAM鉤子運行,並且沒有密碼提示。如果用一個非root用戶,並且該用戶沒有權限設置user ID,這個命令將會因爲程序沒有setuid而失敗。因runuser不會運行認證和賬戶PAM鉤子,它比su更底層。

1、runuser 語法

語法與 su 命令基本一樣:

-, -l, –login

讓shell成爲登錄shell,用 runuser -l PAM 文件替代默認的;

-g –group=group

指定主要的組;

-G –supp-group=group

指定追加組

-c, –command=COMMAND

使用 -c 傳遞單個命令到 shell 中,執行命令後,就退出到 root;

–session-command=COMMAND

通過一個單一的命令用 -c 參數到 shell ,不創建一個新的會話;

-f, –fast

通過 -f 參數到 shell (針對 csh 或 tcsh);

-m, –preserve-environment

不重置環境變量;

-p     same as -m

-s, –shell=SHELL

指定執行命令的shell;

2、runuser 樣例

1
2
3
runuser -l userNameHere -c  '/path/to/command arg1 arg2'
runuser -l oracle -c  'ulimit -SHa'
runuser -s  /bin/sh  -c  "/usr/local/nginx/sbin/nginx"

有時,root用戶由於權限(安全)問題不能瀏覽NFS掛載的共享:

1
ls  -l  /nfs/wwwroot/http

1
cd  /nfs/wwwroot/http

可能的輸出:

1
- bash cd /nfs/wwwroot/http/ : Permission denied

儘管如此,apache用戶被允許瀏覽或訪問掛載在/nfs/wwwroot/http/下基於nfs的系統:

1
runuser -l apache -c  'ls -l /nfs/wwwroot/http/'

1
runuser -l apache -c  'cd /nfs/wwwroot/http/; vi index.php'

使用runuser命令,無需使用密碼,並且,只能在root用戶下使用。

四、總結:su VS su VS dorunuser

命令 root 
到 用戶
用戶
到 root
任意用戶 到 
任意用戶
認證方式 日誌文件 備註
runuser Y N N 因 runuser 不會運行認證和賬戶 PAM 鉤子,它比 su 更底層。
su Y Y Y 目標用戶的密碼

/var/log/auth.log 或

/var/log/secure

你必須與其它用戶分享你的密碼或 root 密碼。
sudo Y Y Y 認證用戶使用他們自己的密碼,而不是目標用戶。

/var/log/auth.log 或

/var/log/secure

允許系統管理員委託授權給一個特定的用戶(或用戶組),讓其在提供審計跟蹤命令後可以以 root 或其它用戶運行某些(或全部)命令。

su 與 runuser 都可以用來寫系統自啓動腳本,如 Tomcat 服務使用系統用戶啓動的自啓動腳本。什麼時候使用哪種命令,根據使用場景自己來決定吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章