python - 通过 Python shell 执行 Git 服务器命令

标签 python git ssh

我正在尝试在 Python 中编写自己的 shell 脚本以供 SSH 调用(使用 SSH 命令=authorized_keys 文件中的参数)。目前我只是调用原始的 SSH 命令(在脚本被称为我的 SSH 之前,它被设置为环境变量)。但是,我总是以关于存储库意外挂起的 git 错误告终。

我的 Python 代码字面意思是:

#!/usr/bin/python
import os
import subprocess

if os.environ('SSH_ORIGINAL_COMMAND') is not None:
    subprocess.Popen(os.environ('SSH_ORIGINAL_COMMAND'), shell=True)
else:
    print 'who the *heck* do you think you are?'

请让我知道是什么阻止了 git 命令成功允许系统工作。作为引用,当客户端调用 git push 时服务器上正在调用的命令是 git-receive-pack /path/to/repo.git .

关于上面显示的 Python 代码,我尝试过使用 shell=Trueshell=False (当 False 时正确地将命令作为列表传递)并且两者都不能正常工作。

谢谢!

最佳答案

找到了解决方案!

您需要调用 communicate() Popen 创建的子进程对象的方法称呼。

proc = subprocess.Popen(args, shell=False)
proc.communicate()

我不完全确定为什么,但我认为这与 communicate() 有关允许通过 stdin 提供数据的方法.我认为这个过程会自动接受输入,因为我根本没有在任何地方覆盖输入流,但也许需要手动调用通信来启动......希望有人可以在这里权衡!

你也不能stdout=subprocess.PIPE因为它会导致命令挂起。同样,不确定这是否是因为 git整个过程的工作或要做的事情。希望这至少可以帮助将来的人!

关于python - 通过 Python shell 执行 Git 服务器命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51956605/

相关文章:

python - 将图像转换为位图

python - 使用 PKCS#7 填充的 Python 3 中的 AES-CBC 128、192 和 256 加密解密

git - 当我将新提交推送到 gerrit 时,如何从命令行设置主题?

git - 无法推送到远程 Git 仓库

fortrabbit 上的 Laravel Envoy

ssh - 使用 rsync 时是否可以指定不同的 ssh 端口?

linux - 为什么我在 git clone 上询问密码?

python - 时间序列的分割 Pandas 数据框

python - 根据列值随机抽样 Pandas

git - 如何将一些文件从一个 git repo 移动到另一个(不是克隆),保留历史