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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!