如何在 Linux 腳本中以其他用戶身份運行命令

已發表: 2022-07-13
藍色背景下筆記本電腦上的 Linux 終端。
fatmawati achmad zaenuri/Shutterstock.com

很自然,當您運行命令或腳本時,系統會將其作為您啟動的進程執行。 但是您可以以其他用戶身份運行命令和腳本。

流程有所有者

當執行程序或腳本時,Linux 會創建一個進程。 該過程有一個所有者。 所有者是另一個進程或用戶帳戶的名稱(如果有人啟動它)。

流程的所有權定義了流程的一些能力和環境。 根據進程的啟動方式,它會繼承其父進程或用戶的某些屬性。 或者,更嚴格地說,用戶用來啟動程序的進程,通常是一個 shell。

如何從 Linux 終端管理進程:你需要知道的 10 個命令
相關如何從 Linux 終端管理進程:你需要知道的 10 個命令

以其他用戶身份運行命令或腳本可能很有用,因為該進程創建的任何文件的所有權都屬於相應的用戶。

每次我們使用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 可以運行

從左到右,權限為:

  • 所有者可以讀取、寫入和執行文件。
  • 組成員可以讀取和寫入文件。
  • 其他人只能讀取該文件。

因此,唯一能夠運行該腳本的用戶是 Mary 和 root。 這是 Mary 運行腳本時發生的情況:

 ./其他用戶.sh 

Mary 運行腳本時的輸出

我們被告知腳本的當前工作目錄是 Mary 的主目錄,並且腳本的所有者是用戶帳戶 maryq。

正如預期的那樣,Dave 無法運行該腳本。

 /home/maryq/other-user.sh 

用戶 Dave 無法運行腳本,權限被拒絕

如果 Dave 具有 root 用戶權限,他可以嘗試以 root 身份運行腳本,使用sudo

 須藤/home/maryq/other-user.sh 

腳本由 root 運行時的輸出

這是部分成功。 腳本運行,但腳本的所有者是 root,而不是 maryq。

我們需要使用的技巧是sudo -u (user) 選項。 這使您可以指定要運行命令的用戶。 如果不使用-u選項, sudo默認使用 root。 如果我們想以 Mary 的身份運行命令,我們需要將他們的用戶帳戶的名稱傳遞給sudo命令。

sudo -u maryq /home/maryq/other-user.sh

使用 -u 用戶選項和 root 以用戶 Mary 身份運行腳本

這次腳本報告進程所有者是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 運行整個腳本來完成的。 您不需要在腳本中使用sudorunuser命令也可以在命令行上使用,因此不限於腳本使用,儘管它是腳本的首選方法。

Dave 無法列出“mary.txt”文件,因為它位於 Mary 的主目錄中並且他沒有訪問權限。

 貓 /home/maryq/mary.txt 

用戶 Dave 無法讀取 Mary 的文件,權限被拒絕

但是,我們可以使用runuser查看文件內部。 - (login) 選項啟動一個新的 shell,其環境與 Mary 實際登錄時所擁有的 shell 環境非常接近。 -c (command) 選項後跟我們要運行的命令。

 sudo runuser -maryq -c 'cat mary.txt' 

使用 runuser 命令讀取 Mary 的文件

請注意,該命令不需要文件的完整路徑。 相對於她的主目錄,我們可以像 Mary 一樣引用該文件。

作為用戶 Dave,我們將創建一個名為“run-maryq.sh”的腳本,其中包含以下文本:

 #!/bin/bash

runuser -l maryq -c 'cat mary.txt'

我們將使其可執行:

 chmod +x 運行-maryq.sh 

使用 chmod 使腳本可執行

讓我們看看當我們嘗試運行它時會發生什麼。

 ./run-maryq.sh 

以普通用戶身份運行帶有 runuser 的腳本

runuser命令會報錯,因為它是由普通用戶執行的。 讓我們用sudo再次運行它。

 須藤 ./run-maryq.sh 

以 root 身份運行帶有 runuser 的腳本

這就像我們希望的那樣工作,就像瑪麗自己啟動了腳本一樣。

使用哪一個?

在命令行上,它們之間沒有太多選擇。 但是由於無論如何您都必須將sudorunuser一起使用,您不妨單獨使用sudo

但在腳本中, runuser是首選命令。

相關: 10 個適合初學者的基本 Linux 命令