Bash:TCP/互联网连接处理

如今有许多问题可以通过互联网更容易地解决。在这篇文章中,我描述如何仅通过 bash 解决这些问题。

连接到互联网服务器的标准方式是嵌入连接流

bash_tcp_connect_example.sh
exec 3<>/dev/tcp/$server/$ircPort || echo "Some text or doing, if connecting failed"

例如,如果你想获取此博客的第一页,你可以运行

bash_http_get_example.sh
exec 3<>/dev/tcp/techoverflow.net/80 && echo -e "GET /index.html HTTP/1.1\r\nhost: techoverflow.net\r\nConnection: close\r\n\r\n" >&3 && cat <&3

然而仍然可以构建更复杂的连接,比如这个小型 irc 机器人

irc_bot.sh
#! /bin/bash

# 在这里你可以做一些配置
nickname="testBot"
server="chat.freenode.net"
ircPort=6667
channels=(\#ubuntu) # 你可以像这样添加多个要加入的频道:
# (channel1 channel2 channel3),但确保你转义每个 #
logFile=log.log

# 做连接和加入的事情
echo "Connecting to server ..."
exec 3<>/dev/tcp/$server/$ircPort || echo "Connection failure! ..."
echo -ne "NICK ${nickname}\r\n" >&3
echo -ne "USER ${nickname} localhost localhost :simple irc bash bot\r\n" >&3
echo "Connect to all channels ..."
for ind in ${!channels[*]}
do
  echo -ne "JOIN ${channels[$ind]}\r\n" >&3
done

# 程序主循环
while true
do
  # 从连接读取下一行
  line=$(head -n 1 <&3)
  # 检查(流)连接是否关闭(网络错误或类似情况)
  # 注意,IRC 服务器从不发送空行
  if [ "$line" == "" ] || [ "$(ls /proc/$$/fd | grep -w '3')" != "3" ]
  then
    echo "Connection to irc server was closed! Quitting ..."
    break
  fi
  # 在屏幕上输出(注意,\n 被 head 命令移除)
  echo "Reciving ..."
  printf "%s\n" "$line" | hd
  # 对 PING 回复 PONG,否则 IRC 服务器假设你不再监听
  # 并将踢你
  if [ "${line:0:5}" == "PING " ]
  then
    echo -n "PONG ${line:5}" >&3
    echo -ne "\r\n" >&3
  fi
  # 这里可以应用更多交互内容
  echo $line >> $logFile
done

exec 3>&- # 关闭输出连接
exec 3<&- # 关闭输入连接

Check out similar posts by category: Allgemein