【发布时间】:2011-08-03 02:36:55
【问题描述】:
我意识到这个问题经常被问到,主要是那些想要拦截 SSH 的密码询问阶段的人。这不是我想要的。我在关注登录后的文字。
我想为 ssh 编写一个包装器,它充当 SSH 和终端之间的中介。我想要这个配置:
(typing on keyboard / stdin) ----> (wrapper) ----> (ssh client)
对于来自 ssh 的输出也是如此:
(ssh client) -----> (wrapper) -----> stdout
通过我在网上找到的标准技巧(简化代码),我似乎能够达到我想要的 stdout 效果:
pipe(fd)
if (!fork()) {
close(fd[READ_SIDE]);
close(STDOUT_FILENO); // close stdout ( fd #1 )
dup(fd[WRITE_SIDE]); // duplicate the writing side of my pipe ( to lowest # free pipe, 1 )
close(STDERR_FILENO);
dup(fd[WRITE_SIDE]);
execv(argv[1], argv + 1); // run ssh
} else {
close(fd[WRITE_SIDE]);
output = fdopen(fd[READ_SIDE], "r");
while ( (c = fgetc(output)) != EOF) {
printf("%c", c);
fflush(stdout);
}
}
就像我说的,我认为这行得通。但是,我似乎不能做相反的事情。我无法关闭(STDIN_FILENO)并复制管道的读取端。 SSH 似乎检测到了这一点并阻止了它。我读过我可以使用“-t -t”选项来强制 SSH 忽略其输入的非标准输入;但是当我尝试这个时它仍然不起作用。
有什么提示吗?
非常感谢!
【问题讨论】:
-
您真的应该使用
dup2而不是dup来替换stdout/stdin 等。 -
ssh不应该关心标准输入的文件类型,如果您使用私钥而不是密码。你可以试试吗?