Linux 重定向交流脚本

前天在床上玩手机的我,刷到这样一条视频 (服务器搭建SSH聊天室,老掉牙的聊天室) ,通过命名文件夹和修改文本文件来实现超古老的信息传递方法,由此我的兴趣突发,我想到能不能通过脚本,把复杂的操作过程简化并优化。

后来我查询资料的时候,发现了通过重定向符号 ">" 可以将输出结果重定向到其他在线的终端,于是就弄出了下面这个脚本工具,其实 Linux 就已经自带了一个简单的信息交流工具了,比如:write和wall,但实在是闲不住,就……

[TOC]

一开始的想法

使用 Shell 脚本和参数传递,通过更改命令参数,实现选择功能,功能一就是每隔 5 秒执行 1 次 cat [file] 以达到实时输出信息效果,功能二就是发送信息,而功能三就是全局信息。

但这只是想了,后来发现有其他方法就替换了这个。

实现的功能

通过传递参数选择功能,但不需要创建和修改文件了,通过重定向符号,把 echo 输出结果重定向到另一个终端,这样就直接实现了发送和实时显示功能了。

然后通过 who 列出在线用户和对应的终端号,这样,就简单实现了我要的功能了。

但这个有个缺点就是不能多人信息交流,只能发给对应的用户,而全局信息还是一样的。

其实,写完后我发现,我所做的只是把 Linux 自带的命令整合起来,方便使用

最终,就弄出了这么一个脚本工具了。

Shell 脚本源码

~/chat.sh

version="v1.1 Beta"

# 分隔符宏定义
hr="-"

# 当前时间
time="\033[0;35m"`date "+%Y-%m-%d %H:%M:%S"`"\033[0m"
# 发送者信息
sender="\033[0;32m"`who am i | awk '{print $1"("$2")"}'`"▶\033[0m"

# 无参数和帮助信息输出
if [[ -z "$1" || "$1" = "-h" ]]; then
    printf "Usage: chat [arg]\nArg:\n"
    printf "  %-4s%s\t%s\n" "-h," "-help" "Get command help."
    printf "  %-4s%s\t%s\n" "-a," "-about" "About the script tool."
    printf "  %-4s%s\t%s\n" "-l," "-list" "List online users."
    printf "  %-4s%s\t%s\n" "-t," "-to" "Who do you want to send it to?"
    printf "  %-4s%s\t%s\n" "-s," "-send" "What do you want to text him/her?"
    printf "\nExample:\n"
    printf "  %-4s\t%s\n" "\"chat -a -l\"" "Show about info and list online users."
    printf "  %-4s\t%s\n" "\"chat -t -s\"" "Send message to him/her."
    printf "  %-4s\t%s\n" "\"chat -t [pts num] -s\"" "Enter the user to send in advance."
    printf "  %-4s\t%s\n" "\"chat -t [pts num] -s [text]\"" "Send a message with one click."
    printf "\nDon't use this two pairs of parameter at the same time:\n"
    printf "  \"-a -l\" and \"-t -s\"\n\n"
fi

# 参数判断处理
for i in "$@"
do
    case $i in
        -a|-about)
            printf "\n SSH 信息交流脚本\n"
            printf "%32s\n" | tr " " $hr
            printf " 版本:$version\n 作者:龙介LongJie\n 网站:https://longjie233.top\n\n   在同一个服务器,不同的地理世\n 界中,如何做到信息的交流呢?\n   当然是最古老的创建文本写上内\n 容了。\n   这个脚本是通过重定向符号,把\n 信息传递给另一个终端里。\n\n"
        ;;
        -l|-list)
            str=`who | awk '{print "用户:" $1 " 终端:" $2}'`
            str_len=`who | awk '{print "用户:" $1 " 终端:" $2}' | wc -L`

            printf "\n%-`expr $str_len + 6`s\n" " 在线用户"
            printf "%`expr $str_len + 3`s\n" | tr " " $hr
            printf " %s\t%s\n" $str
            printf "\n"
        ;;
        -t|-to)
            continue
        ;;
        -s|-send)
            if [[ "$3" = "-s" || "$3" = "-send" ]]; then
                if [ -n "$4" ]; then
                    printf "\n\n${time}\n${sender} $4\n" > /dev/pts/$2
                else
                    read -r -e -p "Send message (str): " msg&&printf "\n\n${time}\n${sender} ${msg}\n" > /dev/pts/$2
                fi
            elif [[ "$2" = "-s" || "$2" = "-send" ]]; then
                read -p "Send to (int): " to
                read -r -e -p "Send message (str): " msg&&printf "\n\n${time}\n${sender} ${msg}\n" > /dev/pts/$to
            else
                echo "Sent to who?"
            fi
        ;;
    esac
done

“食用”文档

参数 说明
-h, -help 获取命名帮助信息
-a, -about 关于这个脚本工具的信息
-l, -list 列出在线用户
-t, -to 你要发送给哪个人?
-s, -send 你要发送啥信息给他/她?

使用例子:

同时显示关于信息和在线用户

chat.sh -a -l

发送消息给 0 号终端

chat.sh -t 0 -s

发送消息给 0 号终端并预先输入好内容

chat.sh -t 0 -s "hello, world"

**注意!**不要把 -a -l-t -s 同时使用,因为我没弄参数判断,不然会出错的。

为脚本创建全局命令

Linux alias 设置别名,为长命令、脚本和可执行文件创建别名,方便自己用。使用 alias 创建名为 chat 的命令,并指向这个脚本。

编辑 /etc/bashrc 在最后一行增加一条命令

alias chat="/usr/local/bin/chat.sh"

这里的 /usr/local/bin/ 是我脚本文件的存放目录,可自定义。

然后,执行 source /etc/bashrc 使刚才的配置生效,最后就可以在任何地方使用该脚本了!