V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
KasuganoSoras
V2EX  ›  分享创造

又做了一个工具 MoeTransfer,更方便地在两台没有公网的服务器之间传输文本

  •  
  •   KasuganoSoras ·
    kasuganosoras · 2019-11-09 06:57:09 +08:00 · 3436 次点击
    这是一个创建于 1601 天前的主题,其中的信息可能已经有所发展或是发生改变。

    受到论坛里另一位大佬的启发 /t/616027,加上自己的骚想法,我做了一个这个玩意。

    我的想法就是,服务器可以不需要保存数据,A 端传输给 B 端后数据立即销毁,不在服务器上储存。

    纯粹是为了练手做的吧,传输文件的话效率很低,我自己测试大约只有 100KB/s 的速度。

    项目地址: https://github.com/kasuganosoras/MoeTransfer

    客户端使用方法

    第一步是将项目 clone 到本地:

    git clone https://github.com/kasuganosoras/MoeTransfer/ /usr/local/MoeTransfer/
    

    接着为客户端设置可执行权限

    chmod -R 755 /usr/local/MoeTransfer/*.sh
    

    (可选)编辑 bashrc,增加快捷命令

    alias mg='/usr/local/MoeTransfer/moeget.sh' # 接收端
    alias ms='/usr/local/MoeTransfer/moesend.sh' # 从标准输入读取并发送数据
    alias msf='/usr/local/MoeTransfer/moesendfile.sh' # 发送文件
    

    然后就可以自由使用了,比如要在 A 服务器发送 test.sh 到 B 服务器:

    • 先在 B 服务器输入 mg 启动接收端
    • 然后在 A 服务器输入 msf B 服务器 IP test.sh

    例如 B 服务器 IP 是 12.34.56.78 ,则发送的命令就是:

    msf 12.34.56.78 test.sh
    

    服务器搭建

    可以自己搭建传输服务器,源码在仓库里,具体使用方法可以看 README

    感谢阅读

    10 条回复    2019-11-09 15:57:32 +08:00
    4ier
        1
    4ier  
       2019-11-09 07:15:56 +08:00 via Android
    没看懂三个 sh 和 server 之间怎么交互的
    KasuganoSoras
        2
    KasuganoSoras  
    OP
       2019-11-09 07:32:34 +08:00
    @4ier #1 moeget.sh 是接收端,在 A 服务器运行,它会跟中转服务器建立一个长连接,此时去 B 服务器运行 moesend.sh ,它会把你的数据发给中转服务器,然后中转服务器再发回给 A 服务器,就完成了数据传输。交互是用 curl 来进行的。
    ahhui
        3
    ahhui  
       2019-11-09 07:41:44 +08:00 via iPhone
    @KasuganoSoras 楼主这是没有公网 IP 的机器之间通过公网中转服务器传输数据的意思吧?主贴标题有歧义啊,没公网访问权限,哪里连得上中转服务器呢
    love
        4
    love  
       2019-11-09 08:19:12 +08:00 via Android
    为啥发送的时候还要指定一个 Ip 呢,太不方便了,直接像剪贴复制那样不指定实现不了吗
    momocraft
        5
    momocraft  
       2019-11-09 08:27:28 +08:00
    以前用过个叫 piping-server 的
    wdv2ly
        6
    wdv2ly  
       2019-11-09 08:29:58 +08:00 via Android
    没有公网 IP 的服务器,输入的 ip 难道是内网 ip 吗?
    dtsdao
        7
    dtsdao  
       2019-11-09 11:18:42 +08:00
    @KasuganoSoras #2
    不懂有何实际意义,不如用 frp 转发个 ssh/ftp
    而且 php 效率不大行啊
    KasuganoSoras
        8
    KasuganoSoras  
    OP
       2019-11-09 14:50:03 +08:00
    @ahhui #3 先写标题再写内容的坏处( 怕标题太长所以删了又删

    @love #4 原本我的想法是,B 服务器运行接收端,获得一个随机 ID,然后 A 服务器直接输入这个 ID 发送,但是后来考虑到这样可能存在安全问题(比如别人可以一个一个 ID 试,然后就可以往你机器发数据了),而使用 IP 地址的话,相比起 ID 就安全很多了。

    @wdv2ly #6 输入的是出口 IP

    @dtsdao #7 纯个人研究学习文件传输……我原本想做个好玩点的功能,就是可以两边实时同步,A 写一点内容 B 那边就显示,但是后来发现貌似是因为服务器的 buffer 还是什么限制了,两边不能同步,只有服务器 close 了连接之后客户端才能显示出收到的内容。
    ahhui
        9
    ahhui  
       2019-11-09 15:20:13 +08:00
    @KasuganoSoras [只有服务器 close 了连接之后客户端才能显示出收到的内容] 这肯定是你的实现有问题啊,感觉是有缓冲里的数据没读取完
    54xavier
        10
    54xavier  
       2019-11-09 15:57:32 +08:00
    [大师球] 捕捉,不明觉厉!!!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1013 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 19:40 · PVG 03:40 · LAX 12:40 · JFK 15:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.