如何在bash中制作聊天脚本?
我想在bash中创建一个聊天脚本,我已经开始了非常基本的工作,您可以使用任何您想要的名称登录,无需密码,然后您可以编写诸如connect、clear、exit等命令 但是我希望能够在终端窗口中开始两个人之间的聊天。现在,我读了一些关于IRC的书,但我不知道如何让它发挥作用 任何帮助都将不胜感激 这是我的剧本:如何在bash中制作聊天脚本?,bash,shell,networking,irc,Bash,Shell,Networking,Irc,我想在bash中创建一个聊天脚本,我已经开始了非常基本的工作,您可以使用任何您想要的名称登录,无需密码,然后您可以编写诸如connect、clear、exit等命令 但是我希望能够在终端窗口中开始两个人之间的聊天。现在,我读了一些关于IRC的书,但我不知道如何让它发挥作用 任何帮助都将不胜感激 这是我的剧本: #!/bin/bash ver=1.0 my_ip="127.0.0.1" function connect() { echo -n "Ip-address: " read ip i
#!/bin/bash
ver=1.0
my_ip="127.0.0.1"
function connect()
{
echo -n "Ip-address: "
read ip
if [ -n "$ip" ]
then
exit
fi
}
function check()
{
if [ "${c}" = "connect" ] || [ "${c}" = "open" ]
then
connect
fi
if [ "${c}" = "clear" ] || [ "${c}" = "cls" ]
then
clear
new
fi
if [ "${c}" = "quit" ] || [ "${c}" = "exit" ]
then
echo "[Shutdown]"
exit
fi
}
function new()
{
echo -n "$: "
read c
if [ -n "${c}" ]
then
check
else
echo "Invalid command!"
new
fi
}
function onLogin()
{
clear
echo "Logged in as ${l_name} on [${my_ip}]"
new
}
function login()
{
echo -n "Login: "
read l_name
if [ -n "${l_name}" ]
then
onLogin
else
echo "Invalid input!"
login
fi
}
#execution
clear
echo "Bash Chat v${ver} | Mac"
login
如果您真的想在纯bash中编写聊天客户端,那么它必须是本地聊天(相同的物理机器),而不是网络聊天 假设这足以满足您的需要,您可以使用(FIFO) 插图 下面是一个示例,演示了如何使用两个管道(用于双向通信):
#!/bin/bash
if [ -z "$2" ] ; then
echo "Need names of chat pipes (yours and other's), eg $0 bob john"
exit 1
fi
P1=/tmp/chatpipe${1}
P2=/tmp/chatpipe${2}
[ -p "$P1" ] || mkfifo $P1
[ -p "$P2" ] || mkfifo $P2
# Background cat of incoming pipe,
# also prepend current date to each line)
(cat $P2 | sed "s/^/$(date +%H:%M:%S)> /" ) &
# Feed one notice and then STDIN to outgoing pipe
(echo "$1 joined" ; cat) >> $P1
# Kill all background jobs (the incoming cat) on exit
trap 'kill -9 $(jobs -p)' EXIT
# (Probably should delete the fifo files too)
和聊天室:
注意此脚本只是一个简单的示例。如果bob和john是不同的unix帐户,您必须更加小心地使用文件权限(或者如果您不关心安全性,mkfifo-m777…是一个选项)聊天室可以用10行bash来创建。今天早些时候,我在我的github上发布了一个 可以处理“n”个用户。他们只需要连接到:1234 代码如下:
#!/bin/bash
mkdir -p /tmp/webCat && printf "HTTP/1.1 200 OK\n\n<!doctype html><h2>Erez's netcat chat server!!</h2><form>Username:<br><input type=\"text\" name=\"username\"><br>Message:<br><input type=\"text\" name=\"message\"><div><button>Send data</button></div><button http-equiv=\"refresh\" content=\"0; url=129.21.194:1234\">Refresh</button></form>" > /tmp/webCat/webpage
while [ 1 ]
do
[[ $(head -1 /tmp/webCat/r) =~ "GET /?username" ]] && USER=$(head -1 /tmp/webCat/r | sed 's@.*username=@@' | sed 's@&message.*@@') && MSG=$(head -1 /tmp/webCat/r | sed 's@.*message=@@' | sed 's@HTTP.*@@')
[ ${#USER} -gt 1 ] && [ ${#MSG} -gt 1 ] && [ ${#USER} -lt 30 ] && [ ${#MSG} -lt 280 ] && printf "\n%s\t%s\n" "$USER" "$MSG" && printf "<h1>%s\t%s" "$USER" "$MSG" >> /tmp/webCat/webpage
cat /tmp/webCat/webpage | timeout 1 nc -l 1234 > /tmp/webCat/r
unset USER && unset MSG
done
#/bin/bash
mkdir-p/tmp/webCat&&printf“HTTP/1.1200 OK\n\nErez的netcat聊天服务器!!用户名:
消息:
发送数据刷新”>/tmp/webCat/webpage
而[1]
做
[[$(head-1/tmp/webCat/r)=~“获取/?用户名”]]和&USER=$(head-1/tmp/webCat/r | sed's@.*用户名=@'| sed的@和消息。*@')和消息=$(head-1/tmp/webCat/r|sed's@.*消息=@@'| sed's@HTTP.*@@')
[${USER}-gt 1]&&&${{USER}-gt 1]&&&${{USER}-lt 30]&&${{USER}-lt 280]&&printf“\n%s\t%s\n”$USER“$MSG”和&printf”%s\t%s“$USER”$MSG”>/tmp/webCat/webpage
cat/tmp/webCat/webpage |超时1 nc-l 1234>/tmp/webCat/r
取消设置用户和取消设置消息(&U)
完成
IRC是一种协议。你可以写任何你想说的代码,但我不确定这与你已经写的任何代码有什么关系。此外,可能已经有成千上万的irc客户端。你真的对用shell脚本编写irc客户端感兴趣吗?当然,不一定是irc客户端,而是允许两个或两个以上的用户通过某种internet协议或类似的协议进行连接,然后能够互相发送消息。shell脚本可以做到这一点,但可能确实不是正确的选择。我想这会让很多事情变得非常复杂。好吧,还有其他方法吗?我至少希望它能从终端上运行。通过重定向到/dev/tcp/$host/$port
或通过nc
,网络聊天当然是可能的。