我有一个在用户下运行的 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”将附加到您的键盘和该终端窗口,并且所有命令都将继承这一点:su
2不知道脚本的其余部分是什么样子;相反,它期望从“stdin”输入命令 – 在本例中是您的键盘。同样,echo "password"
将把密码输出到“stdout”(您的终端窗口),而不是sudo
。
您可以使用管道将一个进程的输出附加到另一个进程的输入;例如:
echo "svn export ..." | su
这是一个坏的;运行命令的方式
su
此处仅用作示例。对于正常使用,su -c 'command'
或sudo command
更好。在您尝试之前
echo password | sudo
:不要浪费你的时间。大多数程序(包括sudo
和su
)都会明确从您的终端(而不是从标准输入)读取密码。对于sudo
,您可以通过编辑 /etc/sudoers 来关闭密码要求,如上所示。
0为了简单起见省略了“stderr”,因为在大多数情况下它的工作方式与“stdout”相同。
1当脚本由svn
的后提交运行时,它将接收/dev/null
其标准输入(也可能是标准输出)。
2简化。实际上,su
它本身并不读取命令,而是启动一个 shell 进程(例如,sh
或bash
)来完成这项工作。