我正在尝试在远程 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/