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

liwlm1x9  于 12个月前  发布在  Shell
关注(0)|答案(6)|浏览(402)

我有一个在仓库用户下运行的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/
kknvjkwl

kknvjkwl1#

我四处寻找,发现了这个有用的解决方案:
编辑您的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/

(You可以选择任何名称并将脚本放在任何地方;我只是建议将svn-postcommit-export作为示例,并将/usr/local/bin作为常见位置。)

pokxtpni

pokxtpni2#

sudo su

启动一个新进程,该进程由root用户所有。在该进程终止或停止后,将再次以执行脚本的用户身份执行下一行。
一个可能的解决方案是使用sudo运行整个脚本,并给予使用sudo的人执行脚本的权限。为此,您需要使用visudo命令编辑/etc/sudoers文件。

ljsrvy3e

ljsrvy3e3#

以root用户身份运行脚本:

sudo sh your-script.sh
5w9g7ksd

5w9g7ksd4#

在脚本的最后一行,您将/home/memarexweb/public_html/devel/的模式更改为777,因此用户“repository”应该能够在没有root权限的情况下将文件复制到该目录。在这种情况下,您不需要使用sudo或su。
但是,将目录的权限更改为777是危险的,因为它允许任何人写入该目录并创建或删除文件。最好将目录的所有权更改为用户“repository”,并将模式更改为755。如果这不可行,您可以添加一个POSIX ACL,允许“repository”写入目录。您可以Google“POSIX ACL”获取更多信息,或者阅读getfaclsetfacl的手册页。

7cjasjjr

7cjasjjr5#

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

chmod u+s myscript.sh

像这样,执行此脚本将给予脚本所有者(root)的权限。
编辑:正如在评论中提到的,stuid不允许用于shell脚本。此解决方案仅适用于可执行文件。

mcdcgff0

mcdcgff06#

谷歌刚刚为我从极客中咳出了这个不错的花絮:

#!/usr/bin/sudo bash
    
    echo "Do your sudo script stuff here"

相关问题