2013-11-02 26 views
3

我正在編寫一個必須以管理員權限運行的bash shell腳本(sudo)。爲什麼我不能將文本重定向到文本文件?

我運行下面的命令

sudo -u $SUDO_USER touch /home/$SUDO_USER/.kde/share/config/kcmfonts > /dev/null 
sudo -u $SUDO_USER echo "[General]\ndontChangeAASettings=true\nforceFontDPI=96" >> /home/$SUDO_USER/.kde/share/config/kcmfonts 

第一個命令成功,並創建文件。但是第二個命令保持與以下示數:

不能創建/home/username/.kde/share/config/kcmfonts:權限被拒絕

我不明白爲什麼這樣下去示數的權限。我以調用sudo的用戶身份運行該命令,所以我應該有權寫入此文件。 kcmfonts文件已成功創建。

有人可以幫我嗎?

+1

即使是超級用戶也需要明確的寫入權限。如果文件模式是444,作爲root將無助於... – Floris

+0

請參閱http://stackoverflow.com/questions/82256/how-do-i-use-sudo-to-redirect-output-to-a-location -i-dont-have-permission-to-wr – shf301

+0

umask可能設置爲0666,導致新文件爲0444.另外,爲什麼在第一行將輸出重定向到/ dev/null? –

回答

3
sudo -u $SUDO_USER echo "some text" >> /home/$SUDO_USER/filename 

sudo執行命令echo "some text"作爲`$ SUDO_USER」。

但重定向下賬戶進行,而不是下$SUDO_USER帳戶。重定向是由shell進程,這是你的處理而不是sudo控制下

試試這個:

sudo -u $SUDO_USER sh -c 'echo "some text" >> /home/$SUDO_USER/filename' 

這樣,sh進程將由$SUDO_USER執行,並且這將處理重定向(並將寫入輸出文件)。

根據命令的複雜程度,您可能需要使用轉義引號和其他特殊字符來玩一些遊戲。如果這是過於複雜(這可能是),你可以創建一個腳本:

$ cat foo.sh 
#!/bin/sh 
echo "some text" >> /home/$SUDO_USER/filename 
$ sudo -u $SUDO_USER ./foo.sh 

現在,它也是./foo.sh命令(執行爲/bin/sh ./foo.sh)將在$SUDO_USER帳戶下運行,它應該有權限寫入輸出文件。

3

考慮這樣做:

echo "some text" | sudo -u $SUDO_USER tee -a /home/$SUDO_USER/filename 

tee命令可以幫助你與輸出定向到文件。 tee的-a選項是爲了追加(如>>),如果沒有它,你會打開文件(如>)。

你不需要用提升的priv來執行左側(儘管它只是回聲,這是一種習慣形成的好習慣),但你只需要提升的privs來寫入文件。所以使用這個命令你只能提升tee的權限。

相關問題