我知道这个问题经常被问到,主要是那些想要拦截 SSH 密码询问阶段的人。这不是我想要的。我在寻找登录后文本。
我想为 ssh 编写一个包装器,作为 SSH 和终端之间的中介。我想要这个配置:
(在键盘/stdin 上打字)---->(包装器)---->(ssh 客户端)
对于来自 ssh 的输出也是如此:
(ssh 客户端)----->(包装器)-----> 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 忽略其输入的非标准输入性质;但是当我尝试这个时它仍然不起作用。
有什么提示吗?
非常感谢!
最佳答案
使用popen (而不是 execv)来执行 ssh cmd 并能够读取和写入 session 。
关于c - 如何拦截 SSH stdin 和 stdout? (不是密码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5622472/