我正在尝试在 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=True
和 shell=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/