我正在尝试用Python语言编写自己的shell脚本,以供SSH调用(使用authorized_keys文件中的SSH command=参数)。目前,我只是调用原始的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
时正确地将命令作为列表传递),但都不能正常工作。
谢谢!
发布于 2018-08-22 06:11:54
找到解决方案了!
您需要调用由Popen
调用创建的子流程对象的communicate()
方法。
proc = subprocess.Popen(args, shell=False)
proc.communicate()
我不完全确定原因,但我认为这与允许数据也通过stdin
提供的communicate()
方法有关。我认为进程会自动接受输入,因为我根本没有覆盖输入流,但也许需要手动调用来进行通信,以踢出有人可以在这里权衡的off...hopefully!
您也不能stdout=subprocess.PIPE
,因为它会导致命令挂起。同样,我不确定这是因为git
是如何工作的,还是因为整个过程需要做些什么。希望这至少能在未来帮助到一些人!
https://stackoverflow.com/questions/51956605
复制相似问题