2016-08-16 67 views
0

我有一個bash腳本,create-file.sh,創建命名一個文件:運行bash腳本使用sudo,但創建用戶文件作爲所有者

$ cat create-file.sh 
    # /bin/bash 
    touch a 

當我運行該腳本,它創建了一個文件'a'與我的用戶作爲所有者。

$ ./create-file.sh 
$ ls -l 
-rw-r--r-- 1 shai wheel 0 Aug 16 17:19 a 

然而,當我下運行sudo的文件與根目錄中創建的用戶腳本:

$ sudo ./create-file.sh 
$ ls -l 
-rw-r--r-- 1 root wheel 0 Aug 16 17:19 a 

有沒有辦法告訴大家,在sudo下運行,用我的用戶創建文件的腳本作爲所有者?

  • 你應該說,接觸單個文件的腳本不需要在sudo下運行。這個例子當然是減少了原來的問題,我的腳本有更多,並且需要在sudo下運行,但我仍然希望用我的用戶作爲所有者來創建文件。
+0

細節也很​​重要 - - 例如,理想的方法可能涉及諸如運行sudo'd腳本作爲協處理的非提升腳本之類的東西。專注於具體解決方案的問題不允許有細微的,量身定製的答案。 –

+0

順便說一下,'#/ bin/bash'不是'#!/ bin/bash'; '!'必須是一個有效的shebang。 –

+0

@Charles Duffy:當然,'#!/ bin/bash',我的不好。 –

回答

1

sudo導出原始用戶名爲SUDO_USER;你可以chown到。

#!/bin/bash 
touch a 
[[ $SUDO_USER ]] && chown "$SUDO_USER" a 

同樣,如果你的sudo配置允許(這是默認值)根放棄特權,任何其他用戶沒有明確的密碼提示,你可以利用這一點:

#!/bin/bash 

# drop privileges back to non-root user if we got here with sudo 
depriv() { 
    if [[ $SUDO_USER ]]; then 
    sudo -u "$SUDO_USER" -- "[email protected]" 
    else 
    "[email protected]" 
    fi 
} 

depriv touch a 
+0

謝謝,這看起來像正確的做法。然而,如果我的腳本通過調用其他腳本或shell命令來創建許多文件,並且其中一些文件可以創建,那麼這將無法很好地擴展。我將不得不提前知道每個正在創建的文件。 –

+0

如果您希望創建的文件的默認所有者不是euid - 對不起,那根本不是UNIX語義。這就是爲什麼我提出了一個協處理方法,除了需要提升腳本的特定部分之外,還要保留原始euid .. –

+0

或者,如果使用'depriv'來包裝「其他腳本或shell命令」權限回到原來的euid),好吧,你在那裏;這就是我提供它的原因。 –