如何在 Linux 腳本中以其他用戶身份運行命令
已發表: 2022-07-13
很自然,當您運行命令或腳本時,系統會將其作為您啟動的進程執行。 但是您可以以其他用戶身份運行命令和腳本。
流程有所有者
當執行程序或腳本時,Linux 會創建一個進程。 該過程有一個所有者。 所有者是另一個進程或用戶帳戶的名稱(如果有人啟動它)。
流程的所有權定義了流程的一些能力和環境。 根據進程的啟動方式,它會繼承其父進程或用戶的某些屬性。 或者,更嚴格地說,用戶用來啟動程序的進程,通常是一個 shell。
以其他用戶身份運行命令或腳本可能很有用,因為該進程創建的任何文件的所有權都屬於相應的用戶。
每次我們使用sudo
時,我們都以另一個用戶身份運行命令。 sudo
使用的默認用戶帳戶是 root 或“超級”用戶。 因此, sudo
經常被錯誤地認為代表超級用戶 do 。 但這只是閒散的行話。 它實際上代表替代用戶做。
使用sudo
,您可以以任何其他用戶身份運行命令,而不僅僅是 root 用戶。 具有諷刺意味的是,您需要 root 權限才能這樣做。 但是啟動另一個用戶擁有的程序或腳本與運行另一個用戶的進程不同。 您仍然會以 root 身份運行它。
以下是如何以另一個用戶的身份實際運行進程,以及如何從腳本中運行命令,就好像它們已由另一個用戶執行一樣。
以其他用戶身份運行腳本
我們正在使用配置了多個用戶的計算機。 一個是 Mary,用戶名為 maryq,另一個是 Dave,用戶名為 dave。
Mary 在她的主目錄中有一個名為“other-user.sh”的腳本。 這是腳本的文本。
#!/bin/bash echo "腳本名稱:" $0 echo "工作目錄:" $(pwd) echo "腳本以用戶身份運行:" $(whoami)
它打印出腳本名稱,該名稱保存在$0
環境變量中。 然後它使用pwd
打印工作目錄。 最後,它使用whoami
命令打印啟動腳本的用戶名。 或者它認為是誰啟動了腳本。
將腳本中的文本複製到編輯器中,並將其另存為“other-user.sh”在不同用戶帳戶的主目錄中。
我們需要使腳本可執行。 我們將使用chmod
命令並使用+x
(執行)選項和-u
(用戶)選項僅為所有者設置執行標誌。 這意味著只有 Mary 可以運行該腳本。 我們將使用ls
檢查文件權限。
chmod u+x 其他用戶.sh
ls
從左到右,權限為:
- 所有者可以讀取、寫入和執行文件。
- 組成員可以讀取和寫入文件。
- 其他人只能讀取該文件。
因此,唯一能夠運行該腳本的用戶是 Mary 和 root。 這是 Mary 運行腳本時發生的情況:
./其他用戶.sh
我們被告知腳本的當前工作目錄是 Mary 的主目錄,並且腳本的所有者是用戶帳戶 maryq。
正如預期的那樣,Dave 無法運行該腳本。
/home/maryq/other-user.sh
如果 Dave 具有 root 用戶權限,他可以嘗試以 root 身份運行腳本,使用sudo
。
須藤/home/maryq/other-user.sh
這是部分成功。 腳本運行,但腳本的所有者是 root,而不是 maryq。
我們需要使用的技巧是sudo -u
(user) 選項。 這使您可以指定要運行命令的用戶。 如果不使用-u
選項, sudo
默認使用 root。 如果我們想以 Mary 的身份運行命令,我們需要將他們的用戶帳戶的名稱傳遞給sudo
命令。

sudo -u maryq /home/maryq/other-user.sh
這次腳本報告進程所有者是maryq。
讓我們在“other-user.sh”腳本中添加一行。 我們將echo
顯一些文本並將輸出重定向到一個名為“mary.txt”的文件中。
#!/bin/bash echo "腳本名稱:" $0 echo "工作目錄:" $(pwd) echo "腳本以用戶身份運行:" $(whoami) echo "這將進入 /home/maryq/ 中的文件" > /home/maryq/mary.txt
我們正在 Mary 的主目錄中創建新文件。 這很好,因為我們以 Mary 身份運行腳本。
./其他用戶.sh
如果我們檢查 Mary 的主目錄,我們會看到該文件已創建,並且該文件的所有權屬於 maryq 用戶帳戶。
ls -hl mary.txt
如果 Mary 自己真的啟動了腳本,我們會看到這種行為。
相關:如何在 Linux 上使用 chmod 命令
運行用戶命令
您可以使用我們目前在腳本中使用的sudo -u
命令,但還有另一個命令runuser
旨在以與腳本內部不同的用戶身份運行進程。 它可以更好地處理已啟動進程的返回代碼,並且比sudo
具有更少的開銷。
runuser
命令需要由 root 運行,但這是通過以 root 運行整個腳本來完成的。 您不需要在腳本中使用sudo
。 runuser
命令也可以在命令行上使用,因此不限於腳本使用,儘管它是腳本的首選方法。
Dave 無法列出“mary.txt”文件,因為它位於 Mary 的主目錄中並且他沒有訪問權限。
貓 /home/maryq/mary.txt
但是,我們可以使用runuser
查看文件內部。 -
(login) 選項啟動一個新的 shell,其環境與 Mary 實際登錄時所擁有的 shell 環境非常接近。 -c
(command) 選項後跟我們要運行的命令。
sudo runuser -maryq -c 'cat mary.txt'
請注意,該命令不需要文件的完整路徑。 相對於她的主目錄,我們可以像 Mary 一樣引用該文件。
作為用戶 Dave,我們將創建一個名為“run-maryq.sh”的腳本,其中包含以下文本:
#!/bin/bash runuser -l maryq -c 'cat mary.txt'
我們將使其可執行:
chmod +x 運行-maryq.sh
讓我們看看當我們嘗試運行它時會發生什麼。
./run-maryq.sh
runuser
命令會報錯,因為它是由普通用戶執行的。 讓我們用sudo
再次運行它。
須藤 ./run-maryq.sh
這就像我們希望的那樣工作,就像瑪麗自己啟動了腳本一樣。
使用哪一個?
在命令行上,它們之間沒有太多選擇。 但是由於無論如何您都必須將sudo
與runuser
一起使用,您不妨單獨使用sudo
。
但在腳本中, runuser
是首選命令。
相關: 10 個適合初學者的基本 Linux 命令