telnet的功能?telnet命令怎么看端口通不通
- 数据库
- 2023-08-27
- 93
大家好,今天来为大家分享telnet的功能的一些知识点,和telnet命令怎么看端口通不通的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相...
大家好,今天来为大家分享telnet的功能的一些知识点,和telnet命令怎么看端口通不通的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
telnet协议用途
Telnet是Internet远程登录服务的标准协议和主要方式,最初由ARPANET开发,现在主要用于Internet会话,它的基本功能是允许用户登录进入远程主机系统。
Telnet可以让我们坐在自己的计算机前通过Internet网络登录到另一台远程计算机上,这台计算机可以是在隔壁的房间里,也可以是在地球的另一端。当登录上远程计算机后,本地计算机就等同于远程计算机的一个终端,我们可以用自己的计算机直接操纵远程计算机,享受远程计算机本地终端同样的操作权限。
Telnet的主要用途就是使用远程计算机上所拥有的本地计算机没有的信息资源,如果远程的主要目的是在本地计算机与远程计算机之间传递文件,那么相比而言使用FTP会更加快捷有效。
打开telnet服务的命令
Windows开启telnet命令
1.点击开始→运行→输入telnet,回车。
2.点击启用或关闭Windows功能
3.找到Telnet客户端,勾选,点击确定
4.搞定,测试一下
打开CMD,在出来的DOS界面里,输入telnet测试端口命令:telnetIP端口或者telnet域名端口,回车。
如果端口关闭或者无法连接,则显示不能打开到主机的链接,链接失败;端口打开的情况下,链接成功,则进入telnet页面(全黑的),证明端口可用
telnet用于什么
Telnet是一种应用层协议,使用于互联网及局域网中,使用虚拟终端机的形式,提供双向、以文字字符串为主的命令行接口交互功能。属于TCP/IP协议族的其中之一,是Internet远程登录服务的标准协议和主要方式,常用于服务器的远程控制,可供用户在本地主机运行远程主机上的工作。
怎么设置telnet功能
要设置telnet功能,需要先确认设备是否支持telnet功能。如果支持,可以按照以下步骤进行设置
1.进入设备的命令行界面,输入telnet命令,查看是否已经开启telnet功能。
2.如果telnet功能未开启,可以使用命令行界面的配置命令进行设置。具体命令为configterminal->linevty04->login->password[password]->exit。
3.上述命令中,linevty04表示设置telnet连接的端口范围,login表示开启登录验证,password[password]表示设置telnet登录密码。
4.设置完成后,可以使用telnet客户端连接设备进行远程管理。
以上是telnet功能设置的基本步骤,具体操作可能会因设备型号和软件版本而有所不同。
telnet深度解析
下面的debug信息来自与/tmp/telenet.debug文件的一部分。
是客户端按下字母e后发生的四个阶段。这篇主要分析第一阶段和第二阶段。
也就是telrcv函数的主要的功能。
td:netread1chars
nd:65e
td:ptyflush1chars
pd:65e
td:ptyread2chars
pd:0065.e
td:netflush1chars
下面的是telnetd.c里面最主要的一个函数,其中里面的for循环也是理解telnetd的工作机制最主要的部分。
int
telnetd_run(void)
{
...
for(;;)
{
fd_setibits,obits,xbits;
registerintc;
if(net_input_level()<0&&pty_input_level()<0)
break;
FD_ZERO(&ibits);
FD_ZERO(&obits);
FD_ZERO(&xbits);
/*Neverlookforinputifthere'sstillstuffinthecorresponding
outputbuffer*/
if(net_output_level()||pty_input_level()>0)
FD_SET(net,&obits);
else
FD_SET(pty,&ibits);
if(pty_output_level()||net_input_level()>0)
FD_SET(pty,&obits);
else
FD_SET(net,&ibits);
if(!SYNCHing)
FD_SET(net,&xbits);
if((c=select(nfd,&ibits,&obits,&xbits,NULL))<=0)
{
if(c==-1&&errno==EINTR)
continue;
sleep(5);
continue;
}
if(FD_ISSET(net,&xbits))
SYNCHing=1;
if(FD_ISSET(net,&ibits))
{
/*Somethingtoreadfromthenetwork...*/
/*FIXME:handle!defined(SO_OOBINLINE)*/
net_read();这里是第一阶段执行的函数
}
if(FD_ISSET(pty,&ibits))
{
/*Somethingtoreadfromthepty...*/
if(pty_read()<=0)
break;
/*ThefirstbyteisnowTIOCPKTdata.Peekatit.*/
c=pty_get_char(1);
#ifdefinedTIOCPKT_IOCTL
if(c&TIOCPKT_IOCTL)
{
pty_get_char(0);
copy_termbuf();/*Ptybufferisnowemptied.*/
localstat();
}
#endif
if(c&TIOCPKT_FLUSHWRITE)
{
staticcharflushdata[]={IAC,DM};
pty_get_char(0);
netclear();/*clearbufferback*/
net_output_datalen(flushdata,sizeof(flushdata));
set_neturg();
DEBUG(debug_options,1,printoption("td:sendIAC",DM));
}
if(his_state_is_will(TELOPT_LFLOW)
&&(c&(TIOCPKT_NOSTOP|TIOCPKT_DOSTOP)))
{
intnewflow=(c&TIOCPKT_DOSTOP)?1:0;
if(newflow!=flowmode)
{
net_output_data("%c%c%c%c%c%c",
IAC,SB,TELOPT_LFLOW,
flowmode?LFLOW_ON:LFLOW_OFF,IAC,SE);
}
}
pty_get_char(0);/*DiscardtheTIOCPKTpreamble.*/
}
while(pty_input_level()>0)
{
if(net_buffer_is_full())
break;
c=pty_get_char(0);
if(c==IAC)
net_output_byte(c);
net_output_byte(c);
if(c=='\r'&&my_state_is_wont(TELOPT_BINARY))
{
if(pty_input_level()>0&&pty_get_char(1)=='\n')
net_output_byte(pty_get_char(0));
else
net_output_byte(0);
}
}
if(FD_ISSET(net,&obits)&&net_output_level()>0)
netflush();
if(net_input_level()>0)
telrcv();
if(FD_ISSET(pty,&obits)&&pty_output_level()>0)
ptyflush();这里是第二阶段执行的函数。
/*Attendingtothechildmustcomelastintheloop,
*soastoletpendingdatabeflushed,mainlytothe
*benefitoftheremoteandexpectingclient.
*/
if(pending_sigchld){
/*Checkforpendingoutput,independentlyofOBITS.*/
if(net_output_level()>0)
netflush();
cleanup(SIGCHLD);/*Notreturningfromthis.*/
}
}
net_read函数分析。这个函数是接收来自net的一个字符。
ncc是个数,用到的netibuf,网络输入缓冲区。可以这么理解。
netip是网络输入缓冲区的指针。
int
net_read(void)
{
ncc=read(net,netibuf,sizeof(netibuf));
if(ncc<0&&errno==EWOULDBLOCK)
ncc=0;
elseif(ncc==0)
{
syslog(LOG_INFO,"telnetd:peerdied");
cleanup(0);
/*NOTREACHED*/
}
elseif(ncc>0)
{
netip=netibuf;
DEBUG(debug_report,1,
debug_output_data("td:netread%dchars\r\n",ncc));
DEBUG(debug_net_data,1,printdata("nd",netip,ncc));
}
returnncc;
}
telrcv函数是一个关键的函数,在文件state.c中定义。
和telnet协议状态机有关。
比如如果第一个字节是FF也就是IAC,那么下面的字节是命令字节。命令选项字节。
net_get_char函数和pty_output_byte函数是理解telrcv函数的主要的地方。
其他的语句都和状态机有关。这两个函数是取一个字符,函数放到pty缓冲区里。
void
telrcv(void)
{
registerintc;
staticintstate=TS_DATA;
while((net_input_level()>0)&!pty_buffer_is_full())
{
c=net_get_char(0);
#ifdefENCRYPTION
if(decrypt_input)
c=(*decrypt_input)(c);
#endif/*ENCRYPTION*/
switch(state)
{
caseTS_CR:
state=TS_DATA;
/*Stripoff\nor\0aftera\r*/
if((c==0)||(c=='\n'))
break;
/*FALLTHROUGH*/
caseTS_DATA:
if(c==IAC)
{
state=TS_IAC;
break;
}
/*
*Wenowmap\r\n==>\rforpragmaticreasons.
*Manyclientimplementationssend\r\nwhen
*theuserhitstheCarriageReturnkey.
*
*WeUSEDtomap\r\n==>\n,since\r\nsays
*thatwewanttobeincolumn1ofthenext
*printableline,and\nisthestandard
*unixwayofsayingthat(\risonlygood
*ifCRMODisset,whichitnormallyis).
*/
if((c=='\r')&&his_state_is_wont(TELOPT_BINARY))
{
intnc=net_get_char(1);
#ifdefENCRYPTION
if(decrypt_input)
nc=(*decrypt_input)(nc&0xff);
#endif/*ENCRYPTION*/
/*
*Ifweareoperatinginlinemode,
*converttolocalend-of-line.
*/
if(linemode
&&net_input_level()>0
&&(('\n'==nc)||(!nc&&tty_iscrnl())))
{
net_get_char(0);/*Removefromthebuffer*/
c='\n';
}
else
{
#ifdefENCRYPTION
if(decrypt_input)
(*decrypt_input)(-1);
#endif/*ENCRYPTION*/
state=TS_CR;
}
}
pty_output_byte(c);
break;
caseTS_IAC:
gotiac:
switch(c)
{
/*
*Sendtheprocessontheptysidean
*interrupt.DothiswithaNULLor
*interruptchar;dependingonthettymode.
*/
caseIP:
DEBUG(debug_options,1,printoption("td:recvIAC",c));
send_intr();
break;
caseBREAK:
DEBUG(debug_options,1,printoption("td:recvIAC",c));
send_brk();
break;
int
net_get_char(intpeek)
{
if(peek)
return*netip;
elseif(ncc>0)
{
ncc--;
return*netip++&0377;
}
return0;
}
void
pty_output_byte(intc)
{
*pfrontp++=c;
}
这里是第二阶段相关的函数。比较好理解。
主要的功能是把缓冲区的字符放到/dev/pty里面
abcdefg
||
pbackppfrontp
上面的pfrontp指针指向的是字母g,如果再输入一个字符h,那么pfrontp指针就指向字符h。
上面的pbackp指针指向的是字母b,如果要拿出一个字符,那么应该先拿出字符b,然后是c,再然后是d。
void
ptyflush(void)
{
intn;
if((n=pfrontp-pbackp)>0)
{
DEBUG(debug_report,1,
debug_output_data("td:ptyflush%dchars\r\n",n));
DEBUG(debug_pty_data,1,printdata("pd",pbackp,n));
syslog(LOG_NOTICE,"ptyflushpbackp=%s",pbackp);
n=write(pty,pbackp,n);
}
if(n<0)
{
if(errno==EWOULDBLOCK||errno==EINTR)
return;
cleanup(0);
/*NOTREACHED*/
}
pbackp+=n;
if(pbackp==pfrontp)
pbackp=pfrontp=ptyobuf;
}
好了,关于telnet的功能和telnet命令怎么看端口通不通的问题到这里结束啦,希望可以解决您的问题哈!
本文链接:http://xinin56.com/su/11223.html