CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 14928|回复: 13

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

[复制链接]
发表于 2013-9-18 23:51:42 | 显示全部楼层 |阅读模式
设想:
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
里面有关于这个的具体设想
如果好记得回复,坏也要回复啊!
回复

使用道具 举报

 楼主| 发表于 2013-9-19 13:56:25 | 显示全部楼层
忙活了一个晚上,一个早上,一个中午
做出来了~~~
C代码(需要python_do_cmd解析器,sunduino中有):
  1. #include <stdlib.h>
  2. #include <sys/types.h>
  3. #include <stdio.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <fcntl.h>
  9. #include <unistd.h>
  10. #include   <stdarg.h>

  11. #define run_in_backstage 0
  12. #define nolog 0

  13. int pid = -1;

  14. void clear(char* txt){
  15. //txt[0] = '\0';
  16. int sz = sizeof(txt);
  17. int i = 0;
  18. for(i = 0;i < sz;i++){
  19. txt[i] = '\0';
  20. }
  21. }

  22. int print(char *fmt, ...)
  23. {
  24. if(pid != 0||nolog){
  25. va_list argptr;
  26. int cnt;
  27. va_start(argptr, fmt);
  28. cnt = vprintf(fmt, argptr);
  29. va_end(argptr);
  30. return(cnt);
  31. }else{
  32. return(0);
  33. }
  34. }

  35. int main()
  36. {
  37. int sfp,nfp,recbytes;
  38. FILE *fl;
  39. char buffer[1025];
  40. char text[100] = "Hey guy,you already login to the Cubieboard.\r\nThis is Sunduino shell.\r\n";
  41. //May not Cb,another board?Than you can edit this.
  42. char pmt[] = ">";
  43. char cmd[1024];
  44. struct sockaddr_in s_add,c_add;
  45. int sin_size;
  46. char result[1000] = "";
  47. int size = sizeof(result)/sizeof(char);
  48. unsigned short portnum=23;
  49. char ers[1024] = "\n";
  50. int rsz = 0;
  51. char terminfo[50];
  52. if(run_in_backstage){
  53. pid = fork();
  54. if(pid != 0){
  55. print("Ok,runs in backstage!Backstage program's pid is %d\n",pid);
  56. return 0;
  57. }else{
  58. print("Backstage started!\n");
  59. }
  60. }
  61. setenv("remote","1",0);
  62. sprintf(text,"%s%s",text,pmt);
  63. print("Telnetd start\n");
  64. sfp = socket(AF_INET, SOCK_STREAM, 0);
  65. if(-1 == sfp)
  66. {
  67.     print("socket fail!\n");
  68.     return -1;
  69. }
  70. print("socket ok!\n");

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

  75. if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
  76. {
  77.     print("bind fail!\n");
  78.     return -1;
  79. }
  80. print("bind ok!\n");

  81. if(-1 == listen(sfp,5))
  82. {
  83.     print("listen fail!\n");
  84.     return -1;
  85. }
  86. print("listen ok!\n");
  87. while(1)
  88. {
  89. sin_size = sizeof(struct sockaddr_in);

  90. nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);
  91. if(-1 == nfp)
  92. {
  93.     print("accept fail!\n");
  94.     return -1;
  95. }
  96. print("accept ok!\nServer start get connect from %#x : %#x\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));
  97. print("Press any key to close this connection.\n");
  98. if(-1 == (recbytes = read(nfp,buffer,1024)))
  99. {
  100.     print("read data1 fail !\n");
  101.     return -1;
  102. }
  103. buffer[recbytes]='\0';
  104. int i;
  105. print("Source first:\n");
  106. for(i=0;i<recbytes;i++){
  107. print("%d:%d -- %c\n",i,buffer[i],buffer[i]);
  108. }
  109. char stxt[] = {255,253,24,255,250,24,1,255,240};
  110. //These character will let server tells the client:
  111. //"I want to know what term are you using".
  112. //I get this from Baidu Baike and Baidu Wenku
  113. print("%s %d\n",stxt,write(nfp,stxt,sizeof(stxt)));
  114. if(-1 == (recbytes = read(nfp,buffer,1024)))
  115. {
  116.     print("read term type fail!\n");
  117.     return -1;
  118. }
  119. buffer[recbytes]='\0';
  120. if(buffer[0] == 255 && buffer[1] == 250 && buffer[3] == 0){
  121. //From baike and wenku,start
  122. print("Your terminal type:");
  123. //Many telnet client's terminal type is in "Assigned Numbers RFC" document
  124. //You may can get what's it means from termcap or terminfo database
  125. //That's from baike
  126. i=4;
  127. while((i+1)<recbytes){
  128. if(buffer[i] == 255 && buffer[i+1] == 240){
  129. //If client says "end",then end,baike~
  130. break;
  131. }
  132. if(isalpha(buffer[i])){
  133. terminfo[i-4] = (buffer[i]+32);
  134. }else{
  135. terminfo[i-4] = buffer[i];
  136. }
  137. i++;
  138. }
  139. terminfo[i] = '\0';
  140. print("%s\n",terminfo);
  141. setenv("remote_term",terminfo,0);
  142. }
  143. if(-1 == write(nfp,text,sizeof(text)))
  144. {
  145.     print("write fail!\n");
  146.     return -1;
  147. }
  148. print("write ok!\n");
  149. //getchar();
  150. //print("sre");
  151. /*if(-1 == (recbytes = read(nfp,buffer,1024)))
  152. {
  153.     print("read data fail !\r\n");
  154. }
  155. buffer[recbytes]='\0';
  156. print("Data:%s\r\n",buffer);
  157. print("Source:\r\n");
  158. for(i=0;i<recbytes;i++){
  159. print("%d:%d -- %c\r\n",i,buffer[i],buffer[i]);
  160. }*/
  161. while(1){
  162. //While while while...infinity while
  163. if(-1 == (recbytes = read(nfp,buffer,1024)))
  164. {
  165.     print("read data fail!\n");
  166. }
  167. //Read data again,again and again
  168. if(recbytes > 0){
  169. //If it has some data
  170. buffer[recbytes]='\0';
  171. print("Data:%s\n",buffer);
  172. print("Source:\n");
  173. for(i=0;i<recbytes;i++){
  174. print("%d:%d -- %c\n",i,buffer[i],buffer[i]);
  175. }
  176. if(sizeof(buffer)/sizeof(char) >= 3){
  177. if(buffer[0] == 255 && buffer[1] == 251 && buffer[2] == 6){
  178. //CTRL+C to exit(linux)
  179. close(nfp);
  180. break;
  181. }
  182. }
  183. if(sizeof(buffer)/sizeof(char) >= 2){
  184. if(buffer[0] == 255 && buffer[1] == 248){
  185. //CTRL+C to exit(linux)
  186. close(nfp);
  187. break;
  188. }
  189. if(buffer[recbytes-2] == 13 && buffer[recbytes-1] == 10){
  190. //if has \r\n
  191. buffer[recbytes-2] = '\0';
  192. buffer[recbytes-1] = '\0';
  193. print("Run: %s\n",buffer);
  194. sprintf(cmd,"python_do_cmd "%s" 2>&1",buffer);
  195. clear(result);
  196. fl = popen(cmd,"r");
  197. print("RES1%s\n",result);
  198. rsz = fread(result,sizeof(char),sizeof(result),fl);
  199. //getResultFromSystemCall(cmd,result,size);
  200. pclose(fl);
  201. result[rsz] = '\0';
  202. print("Count:%d\n",rsz);
  203. print("RES2%s\n",result);
  204. }else{
  205. print("Run: %s",buffer);
  206. sprintf(cmd,"python_do_cmd "%s" 2>&1",buffer);
  207. clear(result);
  208. fl = popen(cmd,"r");
  209. print("RES1%s\n",result);
  210. rsz = fread(result,sizeof(char),sizeof(result),fl);
  211. //getResultFromSystemCall(cmd,result,size);
  212. pclose(fl);
  213. print("Count:%d\n",rsz);
  214. result[rsz] = '\0';
  215. print("RES%s\n",result);
  216. }
  217. }
  218. int p=0,q=0;
  219. for(i=0;i<sizeof(result)/sizeof(char);i++){
  220. /*if(result[i] == '\0') break;
  221. if(result[i] == '\r') result[i] == NULL;*/
  222. if(result[q] == '\r'){
  223. q++;
  224. }else{
  225. if(q != p){
  226. result[p] = result[q];
  227. }
  228. p++;
  229. q++;
  230. }
  231. if(result[q] == '\0'){
  232. result[p] = '\0';
  233. break;
  234. }
  235. }
  236. sprintf(ers,"%s\r%s",result,pmt);
  237. if(-1 == write(nfp,ers,(rsz+sizeof(pmt)+1)))
  238. {
  239.     print("write opt fail!\n");
  240.     return -1;
  241. }
  242. print("ERS%s\n",ers);
  243. print("write opt ok!\n");
  244. clear(ers);
  245. print("RES%s\n",result);
  246. }
  247. }
  248. /*print("Source from client:\r\n");
  249. print("%s\r\n",buffer);*/
  250. close(nfp);
  251. //break;
  252. //Will not break and get the next connection
  253. }
  254. close(sfp);
  255. return 0;
  256. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-9-26 17:49:25 | 显示全部楼层
精神上支持下。

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

使用道具 举报

发表于 2013-9-27 15:45:36 | 显示全部楼层
个人认为,多此一举
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-27 18:51:14 | 显示全部楼层
myreg 发表于 2013-9-27 15:45
个人认为,多此一举

对新手其实还是可以的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-27 18:51:28 | 显示全部楼层
yuruyi 发表于 2013-9-26 17:49
精神上支持下。

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

参考了,现在遇到了点问题
回复 支持 反对

使用道具 举报

发表于 2013-9-28 00:22:02 | 显示全部楼层
如果想要写复杂点用flex/bison 写脚本处理
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-28 06:42:23 | 显示全部楼层
joesonw 发表于 2013-9-28 00:22
如果想要写复杂点用flex/bison 写脚本处理

这个不算复杂啦,一堆if处理即可
回复 支持 反对

使用道具 举报

发表于 2013-10-8 00:17:37 来自手机 | 显示全部楼层
不错啊,挺实用的。
回复 支持 反对

使用道具 举报

发表于 2013-11-23 20:25:30 | 显示全部楼层
嗯,我觉得你可以试试用yacc做一个解释器。代码简单很多的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-11-22 13:18 , Processed in 0.024585 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部