c - 如何拦截 SSH stdin 和 stdout? (不是密码)

标签 c linux ubuntu ssh pipe

我知道这个问题经常被问到,主要是那些想要拦截 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/

相关文章:

mysql - 升级到 ubuntu 16.04 后无法在 MySQL 上迁移 django 数据库

c - 为什么可变长度数组在此 C 代码中工作?

c - 链表故障列表未链接到头指针

c - disable_local_irq 和内核定时器

linux - 在 Linux 系统上,如何将 stdout 重定向到 stderr?

ruby-on-rails - 预配置的 Rails 开发虚拟机

c - 按位或和逻辑或运算符。有什么不同?

c++ - 为什么 syslog 有两个不同的函数声明?

linux - 多个并行 tcp 连接

c# - 间歇性 SIGSEGV(段错误)、SIGABRT 和进程在使用 Mono 的 C# 代码中挂起