2011-09-21 147 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文件。

相关问题