git-shell 在提示时处理的命令不执行任何操作(只是挂起)

标签 c git ssh

我正在尝试在远程 Linux 服务器上设置一个 git 存储库,以便我可以通过 ssh 连接并以相当安全的方式与几个 friend 共享单次登录。我遇到了问题,因为我的 sshd 通过 ssh 配置中设置的 FORCE_COMMAND 调用 duo 安全性(指向 '/usr/sbin/login_duo')。我决定解决这个问题;所以我检查了 git 代码并选择了足够的 C 来进行更改(在 shell.c 中),以便它忽略/usr/sbin/login_duo 调用并调用创建正常的 run_shell() git-shell 提示符。 (我现在很确定这不是正确的解决方案,因为我不希望 git clone 调用最终出现在 shell 中,但这个问题似乎仍然有效)

无论如何,我设法出现了 git> 提示符,但它似乎没有处理我传入的输入(一旦我输入 Enter/exit 然后按回车键)。我希望它打印“git got x”,但它只是坐在那里。有什么想法吗?

            fprintf(stderr, "git> ");
            if (strbuf_getline(&line, stdin, '\n') == EOF) {
                    fprintf(stderr, "\n");
                    strbuf_release(&line);
                    break;
            }
            fprintf(stderr, "git got %s\n", line );

示例:

egwor@mars:~/projects/test$ git clone ssh://git@localhost/home/git/repo1
Cloning into repo1...
git@localhost's password: 
login_duo ignored <-- where I split off and call the shell function
git> exit
<--hangs-->`

最佳答案

line 的类型为:

struct strbuf {
    size_t alloc;
    size_t len;
    char *buf;
};


fprintf(stderr, "git got %s\n", line ) 应该生成如下编译器警告:
警告:格式“%s”需要“char *”类型的参数...

忽略此警告并运行代码可能会导致段错误或其他严重崩溃。

试试这个:

fprintf(stderr, "git got %s\n", line.buf );

关于git-shell 在提示时处理的命令不执行任何操作(只是挂起),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10363311/

相关文章:

c - 如何配置 git 以忽略文件?

Git 樱桃选择然后 rebase

git - 列出使用特定子模块的存储库

git - Android studio git 使用私钥

windows - git,Windows 上的 SSH_ASKPASS

ssh - 如何使用具有不同端口的 scp URI?

c++ - 第 3 方库冲突定义/重新定义

c++ - gets() 导致内存损坏?

比较 int 和 unsigned int

c++ - 在 C/C++ 源代码中包含 Git 提交哈希和/或分支名称