从PHP脚本中运行git命令

I have a file upload form and after the file uploads I want to push the files up to GitHub by running:

git add .
git commit -m "some message"
git push origin master

How do I go about this? I've seen examples of using exec() but that makes me nervous.

shell_exec('cd /var/www/vhost/xxx.com/httpdocs/clients/portal/upoads/54 && /usr/bin/git add -A');
shell_exec('cd /var/www/vhost/xxx.com/httpdocs/clients/portal/upoads/54 && /usr/bin/git commit -m "something 1"');
shell_exec('cd /var/www/vhost/xxx.com/httpdocs/clients/portal/upoads/54 && /usr/bin/git push origin master');

Those commands don't error but don't work either. Do I need to grant access to the apache user to use the ssh key?

douyun3887
douyun3887 我可以从CLI进入该目录,并在我的服务器上以root身份进行提交。
3 年多之前 回复
dongshanxiao7328
dongshanxiao7328 我运行了这个库:github.com/kbjr/Git.php我得到错误“消息:主机密钥验证失败。致命:无法从远程存储库读取。请确保您具有正确的访问权限和存储库存在“。-所以这是一个权限错误,如何让我的Web用户访问已知的主机和密钥?
3 年多之前 回复
dqm74406
dqm74406 我将它分成两个库并将它们放在codeigniter中的/libraries中并使用$this->load->library()成功加载它们但是当我告诉它我的githubrepo路径它要么说它不存在或者不存在一个gitrepo,但它是,我初始化它。
3 年多之前 回复
dongyi4420
dongyi4420 我也试过了:github.com/kbjr/Git.php
3 年多之前 回复
dongren7374
dongren7374 CentOS-是的,我查看了该库,但我使用的是CodeIgniter3而不使用composer,因此我不确定如何实现它。
3 年多之前 回复
dqq46733
dqq46733 你看过PHPGitHubAPI了吗?
3 年多之前 回复
douli4852
douli4852 你的操作系统是什么?
3 年多之前 回复

3个回答

i guess is permission problems, you can use exec() , and get the error info by $output

exec($your_command.' 2>&1', $output, $return_var);
var_dump($output);
dti3914
dti3914 root和apache,有不同的home路径,你最好切换到apache来做那个...
3 年多之前 回复
dua55014
dua55014 但我知道它太sudo chown -R apache:apache~apache / .ssh
3 年多之前 回复
doufan9377
doufan9377 我做到了,我以root身份创建它,将它添加到github,我仍然得到错误。
3 年多之前 回复
douya7121
douya7121 我想,你需要改变网络用户,比如'sudo su - apache',然后在〜/ .ssh(不是/.ssh)中生成一个ssh密钥并添加到github?
3 年多之前 回复
douyunjiaok300404
douyunjiaok300404 如果我在命令行运行它只是说repo clean ...我只需要为我的web用户添加访问ssh密钥,但我不知道怎么做。 我尝试在它的主目录/ .ssh中生成一个新密钥并将其添加到github,但这也不值得。
3 年多之前 回复
douzhi2988
douzhi2988 没什么,只是一个空白的页面
3 年多之前 回复
dongtun1872
dongtun1872 只需运行你的命令,你得到的是什么?/ / / / / / / / / / / / / / / / / / / / / / / / / / git状态
3 年多之前 回复
doukeng1922
doukeng1922 我得到了:array(0){}
3 年多之前 回复
douzhe3516
douzhe3516 我跑了这个:$ your_command ='cd /var/www/vhost/xxx.com/httpdocs/clients/portal/upoads/54&& / usr / bin / git status'; exec($ your_command。'2>&1',$ output,$ return_var); 的var_dump($输出);
3 年多之前 回复




我是否需要授予apache用户访问权限才能使用ssh密钥?</ p>
< /blockquote>
nn

是</ strong>。</ p>
nn

这意味着你必须复制</ strong>某个的密钥 > apache </ code>用户可以阅读它。 SSH将无法工作,除非密钥文件仅供用户读取(即密钥文件上的 0600 </ code>权限)。</ p>

复制密钥如:</ p>

  mkdir -p --mode = 0700~apache / .ssh 
cp / my / id_rsa~apache / .ssh / id_rsa
chown -R apache:apache~apache / .ssh / id_rsa
chmod 0600~apache / .ssh / id_rsa
</ code> </ pre>

此外,您不需要 cd </ code>每次要运行命令。 使用 GIT_DIR </ code>:</ p>

  putenv('GIT_DIR = / path / to / git / repo')\  nshell_exec('git commit ...')
</ code> </ pre>
</ div>

展开原文

原文

Do I need to grant access to the apache user to use the ssh key?

Yes.

This means you have to copy the key somewhere that the apache user can read it. SSH won't work unless the key file is readable by the user only (i.e. 0600 permissions on the key file).

Copy the key like:

mkdir -p --mode=0700 ~apache/.ssh    
cp /my/id_rsa ~apache/.ssh/id_rsa
chown -R apache:apache ~apache/.ssh/id_rsa
chmod 0600 ~apache/.ssh/id_rsa

Also, you don't need to cd every time you want to run the command. Use GIT_DIR:

putenv('GIT_DIR=/path/to/git/repo')
shell_exec('git commit ...')

doubi6669
doubi6669 您可以通过运行su -s / bin / bash操作码来调试以启动shell作为Web服务器用户。
3 年多之前 回复
dongshan1396
dongshan1396 有任何想法吗? LOL必须有一种方式。
3 年多之前 回复
doushangxianq07480
doushangxianq07480 Grisha,如果我在我的PHP脚本中运行exec('whoami')我得到'操作码',当我cat / etc / passwd时,我看到操作码的主目录是/var/www/vhost/xxx.com所以我创建了一个 .ssh目录在那里并移动了文件并应用了你建议的权限,我把它称为操作码:psacln匹配脚本......没有运气。
3 年多之前 回复
doumisha5081
doumisha5081 git remote -v显示正确的repo
3 年多之前 回复
dsag14654
dsag14654 我仍然收到错误:“消息:主机密钥验证失败。致命:无法从远程存储库读取。请确保您具有正确的访问权限并且存储库存在。”
3 年多之前 回复



我解决了它。 我以root用户身份运行了所有这些。 </ p>

在我的PHP脚本中,我运行了</ p>

  exec(“whoami”);

</ code> </ pre>

以获取正在运行该脚本的用户。 然后我运行</ p>

  cat / etc / passwd 
</ code> </ pre>

获取该用户的主目录(/ var /www/vhost/mydomain.com)</ p>

我注意到在我的网络服务器(Centos 7)上我的所有网络文件都被称为操作码:psacln所以我创建了一个.ssh opcode主文件夹中的目录:</ p>

  mkdir -p --mode = 0700 /var/www/vhost/mydomain.com/.ssh 
cd(返回root)
cp .ssh / id_rsa /var/www/vhost/mydomain.com/.ssh/id_rsa
chown -R操作码:psacln /var/www/vhost/mydomain.com/.ssh/id_rsa
chmod 0600 / var / www / vhost /mydomain.com/.ssh/id_rsa

nn

我失踪的是我必须移动我的known_hosts文件,因为我使用的脚本不是 不要加入它。 </ p>

  cp .ssh / known_hosts /var/www/vhost/mydomain.com/.ssh/known_hosts
chmod 0600 /var/www/vhost/mydomain.com/.ssh / known_hosts
</ code> </ pre>

当然,我必须在命令行登录我的服务器并对repo进行初始提交,以便将其添加到我的known_hosts 文件,在我复制之前。 希望这有助于某人。 </ p>
</ div>

展开原文

原文

I solved it. I ran all of this as root user.

Inside my PHP script I ran

exec("whoami"); 

to get the user that is running that script. Then I ran

cat /etc/passwd

to get the home directory for that user (/var/www/vhost/mydomain.com)

I noticed that on my web server (Centos 7) that all my web files were chown'd as opcode:psacln so I created a .ssh directory inside opcode's home folder:

mkdir -p --mode=0700 /var/www/vhost/mydomain.com/.ssh  
cd (back to root)  
cp .ssh/id_rsa /var/www/vhost/mydomain.com/.ssh/id_rsa
chown -R opcode:psacln /var/www/vhost/mydomain.com/.ssh/id_rsa
chmod 0600 /var/www/vhost/mydomain.com/.ssh/id_rsa

The thing I was missing was that I had to also move my known_hosts file over, since the script I was using wasn't adding to it.

cp .ssh/known_hosts /var/www/vhost/mydomain.com/.ssh/known_hosts
chmod 0600 /var/www/vhost/mydomain.com/.ssh/known_hosts

Of course, I had to login to my server at the command line and do an initial commit to the repo in order to get it added to my known_hosts file, before I copied it over. Hope this helps someone.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐