Bash and NC chat room

代码

https://gist.github.com/wrfly/3cafd411dc42822a9b16

效果

![nchat-1/img/nchat/1.png)

![nchat-2/img/nchat/2.png)

![nchat-3/img/nchat/3.png)

介绍

一开始是为了计算机网络的大作业,说是要写一个聊天软件,要用socket,但是我C学的不好,觉得要是让我写C代码,至少得一周才能吃透,所以就想了个懒办法,Bash和Ncat。

一开始的思路是让nc建立连接,通过echo输出,read读取,但是这样只能局限于NC那个界面,而且用户之间并没有标识,negative。

期间接触了一点点bash网络编程的相关知识,比如exec 3<> /dev/tcp/127.0.0.1/80echo "balabala" 1>&3cat <&3

A$ ncat -lp 8080
B$ exec 3<> /dev/tcp/127.0.0.1/80
B$ echo "balabala" 1>&3
B$ cat <&3

通过这种方式来绑定端口或者向端口IO

信息加密解密方法:

en(){ echo $1|openssl aes-256-cbc -k pass -e |openssl aes-256-cbc -k pass -d; }

这个小函数是用来测试加密解密的。

然后说下脚本的思路:

  1. 登陆,确定用户身份,用户名长度要过滤,防止恶意输入
  2. 房间选择,也要过滤,因为是要创建一个新的文档,所以必须过滤掉”. / "等一系列特殊字符,默认是public房间,即所有用户输入输出均在public文件中。
  3. 消息IO,这个是聊天的核心,但是实现起来并不是很难,tail -f一直检测文件变化,因为所有的用户输入都保存到了“chat_room”这个文件里,当有新用户发言的时候所有同一房间下的用户都会收到消息,相当于群聊。如果是想两个人聊天,就可以两个人新建一个聊天室,也就相当于一对一的聊天了。
  4. 数据包格式,这个好弄,时间,用户名,消息数据。
  5. 安全性。远程的安全性永远的不到保障,所以只能在客户端解决。Wait~
  6. 扩展:文件传输,表情包,tmux扩展,发送图片(asciiview)

问题

  • 进程间通信,用tail读取文件
  • 父进程退出之后,子进程不退出(tail -f –pid $$)
  • kill 命令用法
  • 命令行输出颜色 (echo -e “balabala”)
  • $$ 和 $! 的含义 ($BASHPID 和 $SUB_SHELL)
  • 孤儿进程 僵尸进程
  • ‘=~’ 正则表达式匹配

注意事项

  • 用户输入限制,用户名,房间名,消息长度
  • read读取问题 (read usage)
  • pipe实际上开辟了一个subshelll,里面所创建的变量在外部不能被调用(因为外部没有)
  • trap读取信号(kill -l 显示所有信号)

参考资料

comments powered by Disqus