shell_exec和git pull

我希望有人可以提供帮助,我有一个PHP页面,它使用 shell_exec </ code>来压缩 在目录中运行 git pull </ code>以关闭最近的存储库更改。 </ p>

  $ op = shell_exec(“cd / home / user / git / $ repo / $ dir /; zip -r /home/user/archives/$dir.$datestamp  .zip $ dir; cd / home / user / git / $ repo / $ dir /; git pull“); 
</ code> </ pre>

zip工作正常。 如果我将 git pull </ code>更改为例如 git log </ code>或 git status </ code> - 在我的shell_exec中,这也可以,我可以看到日志文件 。 </ p>

似乎不喜欢git pull。</ p>

我看到了另一篇类似的帖子,但不确定它是如何实现的 ;&GT; 带git pull的Shell_exec? </ p>
</ div>

展开原文

原文

I was hoping someone could help, I have a PHP page which uses shell_exec to zip up a directory and run git pull to bring down recent repository changes.

$op = shell_exec("cd /home/user/git/$repo/$dir/; zip -r /home/user/archives/$dir.$datestamp.zip $dir; cd /home/user/git/$repo/$dir/; git pull");

The zip works fine. If I change git pull to for example git log or git status - within my shell_exec, this works also, and I can see the log file.

Just doesn't seem to like git pull.

I saw another similar post to this, but wasn't sure how it was achieved >> Shell_exec with git pull?

duanpuchun5275
duanpuchun5275 尝试从php运行gitpull时的一系列注意事项...jondavidjohn.com/b/7m
大约 8 年之前 回复
du229908
du229908 啊,它试图通过apache用户,任何想法如何改变这一点,使用特定的用户代替..认为这是问题!再次干杯
9 年多之前 回复
doufang2023
doufang2023 您提到的另一个问题的答案是存在权限问题,这似乎是合理的,因为gitlog和gitstatus不需要写入存储库,而gitpull会。为了研究这个,我会改变你的gitpulltotouch/tmp/whatever然后使用ls-l/tmp/whatever来查找拥有该文件的用户和组-这将告诉你shell_exec命令正在运行的用户如。如果你不能以该用户的身份写入存储库目录,那就解释了gitpull失败的原因......
9 年多之前 回复
dsijovl015728613
dsijovl015728613 嗨那里..gitpull不会遗漏任何东西,git拉起源也没有-非常奇怪。
9 年多之前 回复
dtslobe4694
dtslobe4694 gitpull的输出是多少?你有没有尝试过gitpulloriginmaster或者你的分支/遥控器的名字是什么?
9 年多之前 回复

1个回答



从评论中的描述看来,问题是您的 apache </ code>用户无法写入存储库 ,当您使用 git pull </ code>时,这显然是必需的。 您有两个操作过程:</ p>


  1. 设置Apache以另一个用户身份运行脚本(例如,使用 suEXEC 在VirtualHost上或通过userdir )</ li>
  2. 更改存储库的权限,以便 apache </ code>用户可以写入</ li> \ n </ ol>

    您应该仔细考虑任一选择的安全含义,但第二种选择可能最简单。 如果您还没有这样的组,可以使用以下命令创建它:</ p>

      addgroup gitwriters 
    </ code> </ pre>

    ...然后将自己和Apache用户添加到该组:</ p>

      adduser [yourusername] gitwriters 
    adduser apache gitwriters
    </ code> </ pre>

    然后您可以按照另一个问题,用于更改存储库的权限。 重申那些略有不同的内容:</ p>

     #递归,设置存储库的每个文件和目录的组所有权:
    chgrp -R gitwriters / path / to / your / repo

    #递归,使您的存储库的每个文件和目录都可读和写入
    #由组:
    chmod -R g + rw / path / to / your / repo

    #递归,设置 存储库中每个目录的setgid。 目录上的setgid位
    #意味着在目录中创建的文件将具有与目录相同的组
    #所有权。

    find / path / to / your / repo -type d -print0 | xargs -0 chmod g + s
    </ code> </ pre>

    然后希望你的 git pull </ code>能够正常工作。</ p>
    </ div>

展开原文

原文

From your description in the comments it seems that the problem is that your apache user cannot write to the repository, which is clearly required when you use git pull. You have two courses of action:

  1. Setup up Apache to run the script as another user (e.g. using suEXEC either on a VirtualHost or via userdir)
  2. Change the permissions on your repository so the apache user can write to it

You should think carefully about the security implications of either choice, but the second option is probably easiest. If you don't already have such a group, you can create it with:

addgroup gitwriters

... and then add yourself and the Apache user to this group:

adduser [yourusername] gitwriters
adduser apache gitwriters

Then you can follow the instructions in another question to change the permissions on the repository. To reiterate those with some slight variations:

# Recursively, set the group ownership of every file and directory of your repository:
chgrp -R gitwriters /path/to/your/repo

# Recursively, make every file and directory of your repository readable and writable
# by the group:
chmod -R g+rw /path/to/your/repo

# Recursively, set the setgid of every directory in the repository.  The setgid bit
# on directories means that files created in the directory will have the same group
# ownership as the directory.  
find /path/to/your/repo -type d -print0 | xargs -0 chmod g+s

Then hopefully your git pull should work.

dsfhe34889789708
dsfhe34889789708 是的,如果您遵循方法2,则不会更改运行PHP代码的用户,您只是让该用户(以及您的常用用户帐户)能够写入存储库。 你肯定需要让它作为一个不同的用户运行吗? 如果是这样,你需要研究方法1。
9 年多之前 回复
douduan5753
douduan5753 干杯马克为你提供帮助。 我跟着你说的话,目前我有这个:ip-xx-xxx-xx-xxx~:id apache uid = 48(apache)gid = 48(apache)groups = 48(apache),10(wheel), 501(gitwriters)但是当执行git pull时它仍然在apache组下作为apache运行..有没有办法改变默认组 - 如果这有意义! 道歉,这一切都是新的,再次欢呼。
9 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问