我正在尝试在 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整个过程的工作或要做的事情。希望这至少可以帮助将来的人!




