如何以root(sudo)身份运行shell脚本?

时间:2011-09-21 11:50:36

标签: svn shell sudo

我有一个在存储库用户下运行的SVN存储库服务器。我希望在每次提交后操作后运行脚本。我写了一个shell脚本,它在每次提交后从钩子运行。它需要以root身份运行。这就是我在脚本中使用sudo的原因,但它没有用。 有没有办法以root身份运行脚本?

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

5 个答案:

答案 0 :(得分:6)

我在四处寻找并找到了这个有用的解决方案:

编辑sudoers文件以允许在没有密码的情况下运行某些命令。

最好将post-commit脚本分成两部分,其中一部分将通过sudo运行。

  • /etc/sudoers中的条目:

    loqman    ALL=(root) NOPASSWD: /usr/local/bin/svn-postcommit-export
    
  • 你的提交后挂钩:

    #!/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作为公共位置。)

答案 1 :(得分:3)

sudo su

启动root用户拥有的新进程。在该过程终止或停止之后,再次执行下一行,即执行脚本的用户。

一种可能的解决方案是使用sudo运行整个脚本,并使用sudo权限来执行脚本。为此,您需要使用/etc/sudoers命令编辑visudo文件。

答案 2 :(得分:1)

在脚本的最后一行,您将/home/memarexweb/public_html/devel/的模式更改为777,因此用户“repository”应该能够在没有root权限的情况下将文件复制到该目录。在这种情况下,您不需要使用sudo或su。

但是,将目录的权限更改为777是危险的,因为它允许任何人写入该目录并创建或删除文件。最好将目录的所有权更改为用户“repository”并将模式更改为755.如果这不可行,您可以添加POSIX ACL,允许“repository”写入目录。您可以使用Google“POSIX ACL”获取更多信息,或阅读getfaclsetfacl的手册页。

答案 3 :(得分:0)

这不起作用,最好的办法是只在shell脚本中放入requires命令。然后setuid脚本本身,像这样(使用root):

chmod u+s myscript.sh

像这样,执行此脚本将为您提供脚本所有者(root)的权限。

编辑:正如评论中所提到的,shell脚本不允许使用stuid。此解决方案仅适用于可执行文件。

答案 4 :(得分:0)

以root身份运行脚本:

sudo sh your-script.sh