在啟動時以 root 身分執行腳本時出現問題?

在啟動時以 root 身分執行腳本時出現問題?

主要問題:

有沒有一種方法可以在 ubuntu 桌面出現時「完全」運行我的腳本之一,無論是 root、管理員、桌面用戶還是非特權用戶登入?

該腳本有什麼作用?

該腳本安裝一個分割區,在該分割區中尋找文件,最後根據該文件決定將一個分割區複製到另一個分割區。該複製是透過完成的

dd if=/dev/sda2 of=/dev/sda5

腳本什麼時候可以正常運作?

當我從終端運行腳本時,腳本運行順利

sudo ./my_copying_script

該命令詢問我目前登入使用者的密碼。我輸入密碼,腳本開始運作。

腳本什麼時候不能正常運作?

我想在啟動時運行腳本。我使用以下命令將其設定為啟動程序啟動應用程式Ubuntu 的實用程式。腳本在啟動時運行,但在 dd 命令處退出,並返回以下錯誤:

dd: opening '/dev/sda2': Permission denied 

艾德克建議我將 my_copying_script 的擁有者設定為 root 並設定 SUID。現在 my_copying_script 的權限是 (-rwsr-sr-x)。艾德克的觀點是,一旦我設定了suid,啟動程式就會以其擁有者的權限運行。我這樣做了,但出現了相同的 /dev/sda2 權限被拒絕錯誤。

然後我在 dd 前面加上 sudo 前綴,如下所述

 sudo dd if=/dev/sda2 of=/dev/sda5

但這會傳回以下錯誤:

sudo: no tty present and no askpass program specified

答案1

烏斯曼,我認為你至少有我已經提到過的兩個選擇。

最簡單的方法

製作一個設定 UID 的二進位檔案(檢查誰啟動了它並允許使用(如果父進程擁有者可以運行它))運行準備好的腳本並退出。在桌面管理器中啟動即可,僅此而已。請注意,這不是最好的方法,它需要一些 C 編碼。基本上你需要編寫像這樣的範例程式碼:

int main(){
    setuid(0);
    system("/bin/sh /root/bin/mounts.sh");
}

請注意,這實際上是一種駭客攻擊,而不是解決方案。並且一定要使用 root:allowed_group 和 4750 權限二進位如果您不需要它由每個人運行。請記住將可能啟動此操作的所有使用者新增至 allowed_group(選擇您的名字)。

一個好方法

其他更好的方法是創建一種守護進程,在系統啟動時生成(例如,從初始化腳本),但我不確定您將如何準確檢測新的 X 會話何時啟動,我對此不感興趣主題還沒有,我不能給任何清除在這裡提供建議。

答案2

然後在安裝的磁碟機路徑上設定正確的權限,就完成了。

答案3

如果符合以下 3 個條件之一(就密碼而言),sudo 只會以不同使用者身分執行程式:

  1. 指定了 NOPASSWD 選項
  2. 使用者輸入了正確的目標密碼
  3. 使用者輸入了正確的來源密碼

由於選項 2 和 3 需要 TTY(sudo 不會從管道讀取),因此如果找不到 TTY,則不會運行。如果您在任何時候使用 ssh 遠端執行腳本,請檢查您的腳本,因為它可能不會為非互動式遠端命令指派 TTY。

引自:這裡

答案4

一個可能的解決方案是將您的使用者和他嘗試使用 NOPASSWD 參數呼叫的命令新增至 /etc/sudoers 。從 /etc/sudoers 剪切:

# 取消註解以允許 sudo 群組的成員不需要密碼
# (請注意,後面的條目會覆蓋此內容,因此您可能需要移動
# 再往下)
# %sudo ALL=NOPASSWD: 全部

所以也許你需要類似的東西:

myuser ALL=NOPASSWD: mount

我不太確定確切的語法,你最好谷歌一下。

編輯:如果您嘗試掛載網路驅動器,請向 /etc/fstab 新增記錄可能不起作用,因為執行 fstab 時不會載入網路服務。

相關內容