tll 发表于 2013-9-18 23:51:42

大家觉得做个telnet的特殊shell如何

设想:
ssh连接到cb显示的还是普通shell,telnet连接上的,是针对新手的特殊shell,为什么我还要使用这种老掉牙而且不安全的连接方式?那是因为操作简单,可以少code,并且新手一般都在自家局域网里,不会出事的,这个shell与sunduino(前面提到过)兼容,可以方便新手使用,来源于我们学校的路由器,我们学校路由器是dlink的(应该说交换机还是什么的,不是很熟),然后电脑里是xp,我第一天无聊就用cmd把路由器给telnet了(学校电脑自带telnet),然后老师没改密码,直接用户名admin,密码空,登录成功,老师教鞭软件封锁无效,因为它只锁http,不知道我还能用telnet,于是进入路由器的cmd界面,发现有一种不同于普通shell的设置方式,感觉很新颖,想想能不能用到cb上?于是联合sunduino,想到了这个,先不说了,举个例子,例如我想新建一个叫a的程序:
add program a
然后跳出对新手友好的nano,自动填充开头的#!/..../sunduino
接着新手往后面写命令,命令都是极为简单的,使用python来解析
最后新手保存
新手要修改,就
edit program a
还是nano,就修改
我觉得这个和苹果的人性化script——apple script很相似,这个script的语法和英语很像,代码就可以作为一句话来理解,如果达到那种出神入化的程度,新手想不会都不行。
好吧,接着,删除大家应该知道了
del program a或者delete program a
如果直接写add a或edit a或del a,默认就当是编辑程序,add xxx还有其他用处如编辑配置文件(虽然我喜欢给新手菜单)
大家觉得如何?
我初学C,这是我的一个笔记http://user.qzone.qq.com/1040424979/infocenter#!app=2&via=QZ.HashRefresh&pos=1379519187
里面有关于这个的具体设想
如果好记得回复,坏也要回复啊!

tll 发表于 2013-9-19 13:56:25

忙活了一个晚上,一个早上,一个中午
做出来了~~~
C代码(需要python_do_cmd解析器,sunduino中有):#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#include <unistd.h>
#include   <stdarg.h>

#define run_in_backstage 0
#define nolog 0

int pid = -1;

void clear(char* txt){
//txt = '\0';
int sz = sizeof(txt);
int i = 0;
for(i = 0;i < sz;i++){
txt = '\0';
}
}

int print(char *fmt, ...)
{
if(pid != 0||nolog){
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vprintf(fmt, argptr);
va_end(argptr);
return(cnt);
}else{
return(0);
}
}

int main()
{
int sfp,nfp,recbytes;
FILE *fl;
char buffer;
char text = "Hey guy,you already login to the Cubieboard.\r\nThis is Sunduino shell.\r\n";
//May not Cb,another board?Than you can edit this.
char pmt[] = ">";
char cmd;
struct sockaddr_in s_add,c_add;
int sin_size;
char result = "";
int size = sizeof(result)/sizeof(char);
unsigned short portnum=23;
char ers = "\n";
int rsz = 0;
char terminfo;
if(run_in_backstage){
pid = fork();
if(pid != 0){
print("Ok,runs in backstage!Backstage program's pid is %d\n",pid);
return 0;
}else{
print("Backstage started!\n");
}
}
setenv("remote","1",0);
sprintf(text,"%s%s",text,pmt);
print("Telnetd start\n");
sfp = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfp)
{
    print("socket fail!\n");
    return -1;
}
print("socket ok!\n");

bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY);
s_add.sin_port=htons(portnum);

if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
{
    print("bind fail!\n");
    return -1;
}
print("bind ok!\n");

if(-1 == listen(sfp,5))
{
    print("listen fail!\n");
    return -1;
}
print("listen ok!\n");
while(1)
{
sin_size = sizeof(struct sockaddr_in);

nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);
if(-1 == nfp)
{
    print("accept fail!\n");
    return -1;
}
print("accept ok!\nServer start get connect from %#x : %#x\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));
print("Press any key to close this connection.\n");
if(-1 == (recbytes = read(nfp,buffer,1024)))
{
    print("read data1 fail !\n");
    return -1;
}
buffer='\0';
int i;
print("Source first:\n");
for(i=0;i<recbytes;i++){
print("%d:%d -- %c\n",i,buffer,buffer);
}
char stxt[] = {255,253,24,255,250,24,1,255,240};
//These character will let server tells the client:
//"I want to know what term are you using".
//I get this from Baidu Baike and Baidu Wenku
print("%s %d\n",stxt,write(nfp,stxt,sizeof(stxt)));
if(-1 == (recbytes = read(nfp,buffer,1024)))
{
    print("read term type fail!\n");
    return -1;
}
buffer='\0';
if(buffer == 255 && buffer == 250 && buffer == 0){
//From baike and wenku,start
print("Your terminal type:");
//Many telnet client's terminal type is in "Assigned Numbers RFC" document
//You may can get what's it means from termcap or terminfo database
//That's from baike
i=4;
while((i+1)<recbytes){
if(buffer == 255 && buffer == 240){
//If client says "end",then end,baike~
break;
}
if(isalpha(buffer)){
terminfo = (buffer+32);
}else{
terminfo = buffer;
}
i++;
}
terminfo = '\0';
print("%s\n",terminfo);
setenv("remote_term",terminfo,0);
}
if(-1 == write(nfp,text,sizeof(text)))
{
    print("write fail!\n");
    return -1;
}
print("write ok!\n");
//getchar();
//print("sre");
/*if(-1 == (recbytes = read(nfp,buffer,1024)))
{
    print("read data fail !\r\n");
}
buffer='\0';
print("Data:%s\r\n",buffer);
print("Source:\r\n");
for(i=0;i<recbytes;i++){
print("%d:%d -- %c\r\n",i,buffer,buffer);
}*/
while(1){
//While while while...infinity while
if(-1 == (recbytes = read(nfp,buffer,1024)))
{
    print("read data fail!\n");
}
//Read data again,again and again
if(recbytes > 0){
//If it has some data
buffer='\0';
print("Data:%s\n",buffer);
print("Source:\n");
for(i=0;i<recbytes;i++){
print("%d:%d -- %c\n",i,buffer,buffer);
}
if(sizeof(buffer)/sizeof(char) >= 3){
if(buffer == 255 && buffer == 251 && buffer == 6){
//CTRL+C to exit(linux)
close(nfp);
break;
}
}
if(sizeof(buffer)/sizeof(char) >= 2){
if(buffer == 255 && buffer == 248){
//CTRL+C to exit(linux)
close(nfp);
break;
}
if(buffer == 13 && buffer == 10){
//if has \r\n
buffer = '\0';
buffer = '\0';
print("Run: %s\n",buffer);
sprintf(cmd,"python_do_cmd \"%s\" 2>&1",buffer);
clear(result);
fl = popen(cmd,"r");
print("RES1%s\n",result);
rsz = fread(result,sizeof(char),sizeof(result),fl);
//getResultFromSystemCall(cmd,result,size);
pclose(fl);
result = '\0';
print("Count:%d\n",rsz);
print("RES2%s\n",result);
}else{
print("Run: %s",buffer);
sprintf(cmd,"python_do_cmd \"%s\" 2>&1",buffer);
clear(result);
fl = popen(cmd,"r");
print("RES1%s\n",result);
rsz = fread(result,sizeof(char),sizeof(result),fl);
//getResultFromSystemCall(cmd,result,size);
pclose(fl);
print("Count:%d\n",rsz);
result = '\0';
print("RES%s\n",result);
}
}
int p=0,q=0;
for(i=0;i<sizeof(result)/sizeof(char);i++){
/*if(result == '\0') break;
if(result == '\r') result == NULL;*/
if(result == '\r'){
q++;
}else{
if(q != p){
result = result;
}
p++;
q++;
}
if(result == '\0'){
result = '\0';
break;
}
}
sprintf(ers,"%s\r%s",result,pmt);
if(-1 == write(nfp,ers,(rsz+sizeof(pmt)+1)))
{
    print("write opt fail!\n");
    return -1;
}
print("ERS%s\n",ers);
print("write opt ok!\n");
clear(ers);
print("RES%s\n",result);
}
}
/*print("Source from client:\r\n");
print("%s\r\n",buffer);*/
close(nfp);
//break;
//Will not break and get the next connection
}
close(sfp);
return 0;
}

yuruyi 发表于 2013-9-26 17:49:25

精神上支持下。

学c不妨多参考下现有资源。
有现成东西的,ssh、netcat 连 bash 自己都支持 tcp udp。

myreg 发表于 2013-9-27 15:45:36

个人认为,多此一举

tll 发表于 2013-9-27 18:51:14

myreg 发表于 2013-9-27 15:45 static/image/common/back.gif
个人认为,多此一举

对新手其实还是可以的

tll 发表于 2013-9-27 18:51:28

yuruyi 发表于 2013-9-26 17:49 static/image/common/back.gif
精神上支持下。

学c不妨多参考下现有资源。


参考了,现在遇到了点问题

joesonw 发表于 2013-9-28 00:22:02

如果想要写复杂点用flex/bison 写脚本处理

tll 发表于 2013-9-28 06:42:23

joesonw 发表于 2013-9-28 00:22 static/image/common/back.gif
如果想要写复杂点用flex/bison 写脚本处理

这个不算复杂啦,一堆if处理即可

gnensis 发表于 2013-10-8 00:17:37

不错啊,挺实用的。

rgwan 发表于 2013-11-23 20:25:30

嗯,我觉得你可以试试用yacc做一个解释器。代码简单很多的。
页: [1] 2
查看完整版本: 大家觉得做个telnet的特殊shell如何