如何以 root 身份运行 SVN 提交后脚本?

如何以 root 身份运行 SVN 提交后脚本?

我有一个在用户下运行的 SVN 存储库服务器repository,并且我想在每次提交后操作后运行一个脚本。

因此,我编写了一个 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/

答案1

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

最好将提交后脚本分成两部分,其中一部分将通过运行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作为一个常见的位置。)


那为什么它不起作用呢

您可能认为脚本中的所有内容都会像您使用键盘输入一样运行。事实并非如此。解释器 ()分别运行每个命令,等待其完成,然后运行下一个命令。

对于如何处理输入和输出也有一些规则——程序从“stdin”读取输入——不是 从脚本中获取密码 – 并将输出写入“stdout” 0。当您在终端窗口1中运行脚本时,其“stdin”和“stdout”将附加到您的键盘和该终端窗口,并且所有命令都将继承这一点:su2不知道脚本的其余部分是什么样子;相反,它期望从“stdin”输入命令 – 在本例中是您的键盘。同样,echo "password"将把密码输出到“stdout”(您的终端窗口),而不是sudo

您可以使用管道将一个进程的输出附加到另一个进程的输入;例如:

echo "svn export ..." | su
  • 这是一个坏的;运行命令的方式su此处仅用作示例。对于正常使用,su -c 'command'sudo command更好。

  • 在您尝试之前echo password | sudo不要浪费你的时间。大多数程序(包括sudosu)都会明确从您的终端(而不是从标准输入)读取密码。对于sudo,您可以通过编辑 /etc/sudoers 来关闭密码要求,如上所示。


0为了简单起见省略了“stderr”,因为在大多数情况下它的工作方式与“stdout”相同。

1当脚本由svn的后提交运行时,它将接收/dev/null其标准输入(也可能是标准输出)。

2简化。实际上,su它本身并不读取命令,而是启动一个 shell 进程(例如,shbash)来完成这项工作。

相关内容