2015-02-09 83 views
1

我有一個腳本需要以root身份運行。在這個腳本中,我創建了目錄和文件。運行腳本的用戶不能修改這些文件和目錄(除非有根目錄)。文件權限,root bash腳本,用戶編輯

我試圖在這裏發現了幾個解決方案和其他網站,首先我想mkdir -m 777目錄像這樣:

#!/bin/bash 

... 

#Check execution location 

CDIR=$(pwd) 

#File setup 

DATE=$(date +"%m-%d_%H:%M:%S") 
LFIL="$CDIR/android-tools/logcat/logcat_$DATE.txt" 
BFIL="$CDIR/android-tools/backup/backup_$DATE" 

mkdir -m 777 -p "$CDIR/android-tools/logcat/" 
mkdir -m 777 -p "$CDIR/android-tools/backup/" 

... 

我也試圖觸碰每個創建的文件和目錄與$ USER爲根,像所以:

#!/bin/bash 

... 

#Check execution location 

CDIR=$(pwd) 

#File setup 

DATE=$(date +"%m-%d_%H:%M:%S") 
LFIL="$CDIR/android-tools/logcat/logcat_$DATE.txt" 
BFIL="$CDIR/android-tools/backup/backup_$DATE" 

mkdir -p "$CDIR/android-tools/logcat/" 
mkdir -p "$CDIR/android-tools/backup/" 

sudo -u $USER touch "$CDIR/" 
sudo -u $USER touch "$CDIR/android-tools/" 
sudo -u $USER touch "$CDIR/android-tools/logcat/" 
sudo -u $USER touch "$CDIR/android-tools/backup/" 
sudo -u $USER touch "$CDIR/android-tools/logcat/logcat_*.txt" 
sudo -u $USER touch "$CDIR/android-tools/logcat/Backup_*" 

... 

我也曾嘗試手動從腳本目錄運行sudo chmod 777 /android-tools/*,並sudo chmod 777 /*,給沒有錯誤,但我還是不能沒有root權限刪除文件。

繼承人完整的腳本,它還沒有完成。不要在連接到電腦的Android設備上運行它。

http://pastebin.com/F20rLJQ4

回答

1

touch不改變所有權。我想你想要chown

如果您使用sudo運行腳本,$USER是根,但$SUDO_USER是誰跑sudo用戶,這樣你就可以使用它。

如果你不使用sudo,你不能相信$USER是特別的東西。來電者可以將其設置爲任何內容(如"root cat /etc/shadow",這會讓您的上述腳本做出令人驚訝的事情,因爲您說的$USER而不是"$USER")。

如果您使用setuid運行此腳本,則無論$USER中出現什麼字符串,您都需要安全的方法來獲取調用進程的合法UID,如id -u

如果您覆蓋通過使makestuff.sh這樣兩種可能性:

# $SUDO_USER if set, otherwise the current user 
caller="${SUDO_USER:-$(id -u)}" 

mkdir -p foo/bar/baz 
chown -R "$caller" foo 

然後你就可以使用這種方式:

sudo chown root makestuff.sh 
sudo chmod 755 makestuff.sh 

# User runs it with sudo 
sudo ./makestuff.sh 

# User can remove the files 
rm -r foo 

還是這樣(如果你想使用的setuid所以普通用戶可以在沒有sudo訪問的情況下運行腳本 - 這可能不會,因爲您對此不夠細心):

sudo chown root makestuff.sh 
sudo chmod 4755 makestuff.sh # Danger! I told you not to do this. 

# User runs it without sudo 
./makestuff.sh 

# User can remove the files 
rm -r foo