2011-09-21 175 views
5

我有一個在版本庫用戶下運行的SVN版本庫服務器。我想在每個提交後操作後運行腳本。我寫了一個shell腳本,每次提交後都從掛鉤運行。它需要以root身份運行。這就是爲什麼我在腳本中使用了sudo,但沒有奏效。 有什麼辦法以root身份運行腳本?如何以root用戶身份運行shell腳本(sudo)?

sudo su 
echo "password" 
svn export --force file:///home/repository/trunk/ /home/memarexweb/public_html/devel/ 
chmod -R 777 /home/memarexweb/public_html/devel/ 
+0

更好的移動問題superuser.com – Yousf

+0

一個選項可以禁用密碼但是,這不是個很好的辦法HTTP:// maestric .com/doc/unix/ubuntu_sudo_without_password – FUD

+0

製作文件模式777可能不是一個好主意,它們將是世界上可寫的。 – eckes

回答

6

我正在尋找了一圈,發現這個有用的解決方案:

編輯您的sudoers文件以允許不使用密碼運行某些命令。

最好將您的post-commit腳本分成兩部分,其中一部分將通過sudo運行。

  • /etc/sudoers條目:

    loqman ALL=(root) NOPASSWD: /usr/local/bin/svn-postcommit-export 
    
  • 你的post-commit鉤子:

    #!/bin/sh 
    sudo /usr/local/bin/svn-postcommit-export 
    
  • 腳本/usr/local/bin/svn-postcommit-export

    #!/bin/sh 
    svn export --force file:///home/repository/trunk/ /home/memarexweb/public_html/devel/ 
    chmod -R 777 /home/memarexweb/public_html/devel/ 
    

    (喲你可以選擇任何名字並把腳本放在任何地方;我只是建議svn-postcommit-export爲例,和/usr/local/bin作爲公共場所)

0

這是行不通的,最好的辦法是隻在shell腳本中放入require命令。然後setuid腳本本身,就像這樣(用root):

chmod u+s myscript.sh 

這樣,執行這個腳本會給你的腳本(根)的所有者的權限。

編輯:正如在評論中提到的,stuid不允許用於shell腳本。該解決方案僅適用於可執行文件。

+0

在shell腳本上設置'suid'標誌是** DANGEROUS **,以至於Linux會忽略它。有關詳細信息,請參閱答案中鏈接的維基百科文章。 –

+0

對不起A.H.,我沒有完全理解你。你的意思是Linux會忽略setuid?爲什麼它是危險的? – Yousf

+2

Linux將忽略腳本**上的'suid' **,可執行文件可以。許多UNIX衍生產品在這些日子裏都這樣做。一些原因[在此解釋](http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html) –

1

在腳本的最後一行中,您將/home/memarexweb/public_html/devel/的模式更改爲777,因此用戶「存儲庫」應該能夠將文件複製到該目錄,而無需root權限。在這種情況下,你不需要使用sudo或su。

但是,將目錄的權限更改爲777是很危險的,因爲它允許任何人寫入該目錄並創建或刪除文件。將目錄的所有權更改爲用戶「存儲庫」並將模式更改爲755會更好。如果這樣做不可行,則可以添加允許「存儲庫」寫入目錄的POSIX ACL。您可以通過Google「POSIX ACL」獲取更多信息,或者閱讀手冊頁getfaclsetfacl

3
sudo su 

啓動一個新的進程,由root用戶擁有。在該進程被終止或停止之後,再次執行下一行,作爲執行該腳本的用戶。

一個可能的解決方案是使用sudo運行整個腳本,並使用sudo權限來執行腳本。爲此,您需要使用visudo命令編輯/etc/sudoers文件。

相關問題