V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
phpfpm
V2EX  ›  程序员

如何在后台启动一个 ssh 进程,其他进程可以与这个 ssh 进程交互执行命令拿到返回值?

  •  
  •   phpfpm · 2020-01-30 18:43:51 +08:00 · 2694 次点击
    这是一个创建于 1757 天前的主题,其中的信息可能已经有所发展或是发生改变。

    X problem:

    远程机器上有一些文件( 10~几百 KiB ),不大,如何高效地获取这些文件 /并且在获取之后删除等操作

    Y 方案:

    获取文件:

    $ ssh server cat /path/to/target
    

    获取返回值;或者用 nginx 通过 http 拿到文件; 删除文件: ssh 远程执行删除

    问题: 每次连接初始化的时间过长,由于 ssh 是通过一层隧道( frp )反向连回来的,因此每次获取的 FTTB 略长

    想问问有没有什么长连接的方式?

    e.g.

    如果是手动的话,开启一个 ssh 进程,通过 copy-paste/zmodem/管道(?)的方式,把文件拿到本地,之后删掉文件,避免每次建立连接的开销

    emm,so ssh 能支持这个需求吗?

    12 条回复    2020-01-31 09:30:05 +08:00
    ysc3839
        1
    ysc3839  
       2020-01-30 18:46:35 +08:00 via Android
    用 SCP 协议不行吗?
    phpfpm
        2
    phpfpm  
    OP
       2020-01-30 18:49:06 +08:00
    @ysc3839 行,主要是我是要在一个别的进程里面拿到这个文件,ssh cat 直接就拿到字节流了,scp 还得再生成一个临时文件;

    但是问题都是:

    我单次都是只获得一个文件,scp 也是一次一文件,有连接开销的。
    ysc3839
        3
    ysc3839  
       2020-01-30 18:53:03 +08:00 via Android
    @phpfpm 把要获取的所有文件都用 tar 打包,然后 ssh 传过来?
    phpfpm
        4
    phpfpm  
    OP
       2020-01-30 18:56:34 +08:00
    @ysc3839 我要及时性,emm
    Buges
        5
    Buges  
       2020-01-30 18:57:27 +08:00   ❤️ 1
    libssh
    publicccc
        6
    publicccc  
       2020-01-30 19:46:23 +08:00
    可以参考下 sz 和 rz 的实现,
    猜测可能是服务端输出特殊的编码使得 ssh 客户端识别到是在发送文件。

    自己实现的话方案应该是找一个 ssh 库,自己读取输出识别编码。
    phpfpm
        7
    phpfpm  
    OP
       2020-01-30 19:47:44 +08:00
    @Buges 愿闻其详!
    https://github.com/degagne/libssh2
    @publicccc

    sz/rz 用的是 zmodem,这玩意貌似也比较古老了。。
    guoshim
        8
    guoshim  
       2020-01-30 19:48:28 +08:00
    可以用管道来控制另一个进程,并监测另一个进程的 stdin/stdout/stderr。Python 里面有个包叫 pexpect,可以搞这个,也可以自己手撸。

    或者按照楼上所说,libssh。
    superrichman
        9
    superrichman  
       2020-01-30 19:52:55 +08:00 via iPhone
    用 python 的 paramiko 模块,能执行 shell 命令也可以下载文件,写代码建立连接一直不关就好了
    phpfpm
        10
    phpfpm  
    OP
       2020-01-30 20:06:39 +08:00
    @guoshim 优秀!!
    php 下面不知道这个方案是不是好 work,我先用 libssh2 了

    ubuntu19.04

    ```
    # apt install php-ssh2
    # php -i | grep ssh2


    $ composer require degagne/libssh2

    ```

    齐活!
    cy97cool
        11
    cy97cool  
       2020-01-30 20:58:31 +08:00   ❤️ 3
    直接 sshfs 把远程服务器的目录挂载不就完事了?
    winglight2016
        12
    winglight2016  
       2020-01-31 09:30:05 +08:00
    @cy97cool 还有这种操作,学习了!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5535 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:36 · PVG 09:36 · LAX 17:36 · JFK 20:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.