如何获取telnet会话的远程端口号?

时间:2012-11-23 05:56:50

标签: c unix freebsd unix-socket

我正在尝试获取远程用户的telnet连接使用的TCP端口号。

在ssh连接的情况下,我能够从SSH_CLIENT env变量获取它,但是如果在telnet连接的情况下如何获取它。是否有任何C / Unix API可以获得它。

我尝试了以下代码:

u_int32_t 
port_session_connected (void)
{
    struct sockaddr_storage from;
    char *ssh_client;
    char *remote_port;
    char *temp;
    static char remoteport[1024];
    int socklen;
    int rv = 0, err; 

    if ((ssh_client = getenv("SSH_CLIENT")) != NULL) {
        syslog("(%s): Have SSH_CLIENT: %s", __func__, ssh_client);
        if ((temp = strtok(ssh_client, " \t")) != NULL) {
            remote_port = strtok(NULL, " \t");
            syslog("(%s): Remote port: %s", __func__, remote_port);
            if (remote_port) rv = atoi(remote_port);
            return rv;
        }
    } /* For ssh sessions */

    socklen = sizeof(from);
    if (getpeername(STDIN_FILENO, (struct sockaddr *)&from, &socklen) == 0) { 
        struct sockaddr_in *sck;
        sck = (struct sockaddr_in *)&from;
        syslog("(%s): getpeername() success", __func__);
        syslog("(%s): Remote IP: %s\n", __func__, inet_ntoa(sck->sin_addr));
        syslog("(%s): Remote Port: %d\n", __func__,  (int)ntohs(sck->sin_port));
        syslog("(%s): Family: %d\n", __func__,  (int)(sck->sin_family));

        err = getnameinfo((struct sockaddr *)&from, socklen, NULL, 0, 
                          remoteport, sizeof(remoteport),NI_NUMERICSERV);
        syslog("(%s): getnameinfo() return: %d", __func__, err);
        if (err == 0) { 
            syslog(LOG_NOTICE, "(%s): getnameinfo() success", __func__);
            syslog(LOG_NOTICE, "(%s): Remote port: %s", __func__, remoteport);
            rv = atoi(remoteport);
            return rv;
        }
    } /* For telnet session*/

    return 0;
}

函数适用于ssh连接。 但是对于telnet连接,我无法获得会话中使用的远程端口号。

记录Telnet案例:

  

(port_session_connected):getpeername()成功   (port_session_connected):远程IP:0.0.0.0(port_session_connected):   远程端口:0(port_session_connected):系列:1   (port_session_connected):getnameinfo()返回:5

     

getnameinfo()以err = 5失败,即EAI_FAMILY / * ai_family not   支持* / Family为1,即AF_UNIX。

是的,getnameinfo()仅适用于AF_INET和AF_INET6。

是否有任何API或任何方式来获取telnet远程端口。

由于

1 个答案:

答案 0 :(得分:1)

对等体的地址由服务器端的accept()调用返回。由于这是由telnet守护程序完成的,因此无法从您的代码访问它(请参阅Stevens, Vol.1 p.118)。

所以一种可能的方法是编写某种代理,它接受传入的连接,记录对等地址信息,然后建立与真正的telnet守护进程的连接,并将连接传递给它。