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/80
和echo "balabala" 1>&3
和cat <&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; }
这个小函数是用来测试加密解密的。
然后说下脚本的思路:
- 登陆,确定用户身份,用户名长度要过滤,防止恶意输入
- 房间选择,也要过滤,因为是要创建一个新的文档,所以必须过滤掉”. / "等一系列特殊字符,默认是public房间,即所有用户输入输出均在public文件中。
- 消息IO,这个是聊天的核心,但是实现起来并不是很难,
tail -f
一直检测文件变化,因为所有的用户输入都保存到了“chat_room”这个文件里,当有新用户发言的时候所有同一房间下的用户都会收到消息,相当于群聊。如果是想两个人聊天,就可以两个人新建一个聊天室,也就相当于一对一的聊天了。 - 数据包格式,这个好弄,时间,用户名,消息数据。
- 安全性。远程的安全性永远的不到保障,所以只能在客户端解决。Wait~
- 扩展:文件传输,表情包,tmux扩展,发送图片(asciiview)
问题
- 进程间通信,用tail读取文件
- 父进程退出之后,子进程不退出(tail -f –pid $$)
- kill 命令用法
- 命令行输出颜色 (echo -e “balabala”)
- $$ 和 $! 的含义 ($BASHPID 和 $SUB_SHELL)
- 孤儿进程 僵尸进程
- ‘=~’ 正则表达式匹配
注意事项
- 用户输入限制,用户名,房间名,消息长度
- read读取问题 (read usage)
- pipe实际上开辟了一个subshelll,里面所创建的变量在外部不能被调用(因为外部没有)
- trap读取信号(kill -l 显示所有信号)
参考资料
- read命令详解
- linux僵尸进程
- 孤儿进程
- 孤儿进程&僵尸进程总结
- Bash color
- Bash color II
- Kill usage
- Linux read usage
- Read tips
- [bind port](http://www.schnallich.net/index.php?title: Bash and NC chat room