将Linux Shell输出重定向到socket
0.实验环境
- 操作系统:Ubuntu 18.04.4
Linux version 5.4.0-67-generic
(buildd@lcy01-amd64-010)
(gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04))
- Python:Python 2.7.17
1.客户端:借助/dev/tcp建立socket链接
1.1 将shell输出重定向到socket:
shell2socket.sh:
#!/bin/bash
exec 8<>/dev/tcp/127.0.0.1/8080
echo "Hello Server">&8
exec 8<>/dev/tcp/127.0.0.1/8080
用于建立到服务器的socket连接,其中:
exec
表示执行命令;8
是用户指定的文件描述符;<>
应该被拆开为<和>理解,表示读和写,即以RW的形式打开;/dev/tcp/127.0.0.1/8080
是被打开的设备,这里指定了服务器IP为127.0.0.1,端口为8080。其中,服务器IP可以被替换为域名,例如www.baidu.com。
echo "Hello Server">&8
能将echo的输出内容(“Hello Server”)通过socket发送。
执行shell2socket.sh:
bash shell2socket.sh
1.2 将python输出重定向到socket:
py2socket.sh:
#!/bin/bash
exec 8<>/dev/tcp/127.0.0.1/8080
python -u py2socket.py >&8
# 关闭对文件描述符8的写和读
# exec 8>&-
# exec 8<&-
python -u py2socket.py >&8
中:
-u
参数设定python实时输出,而不使用I/O缓冲。
py2socket.py:
print("hello server")
2. 服务器端:配合客户端完成测试
服务器端代码:
借助python实现,主要功能是测试客户端是否能正常发送数据。
参考资料.
server.py:
#!/usr/bin/env python
# -*- coding=utf-8 -*-
"""
file: service.py
socket service
"""
import socket
import threading
import time
import sys
def socket_service():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 8080))
s.listen(10)
except socket.error as msg:
print msg
sys.exit(1)
print 'Waiting connection...'
while 1:
conn, addr = s.accept()
t = threading.Thread(target=deal_data, args=(conn, addr))
t.start()
def deal_data(conn, addr):
print 'Accept new connection from {0}'.format(addr)
data = conn.recv(1024)
print '{0} client send data : \n{1}'.format(addr, data)
if __name__ == '__main__':
socket_service()