• 请不要在回答技术问题时复制粘贴 AI 生成的内容
phpfpm
V2EX  ›  程序员

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

  •  
  •   phpfpm · Jan 30, 2020 · 3986 views
    This topic created in 2470 days ago, the information mentioned may be changed or developed.

    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 replies  •  2020-01-31 09:30:05 +08:00
    ysc3839
    ysc3839
    Jan 30, 2020 via Android
    1
    用 SCP 协议不行吗?
    phpfpm
    phpfpm
    OP
    Jan 30, 2020
    2
    @ysc3839 行,主要是我是要在一个别的进程里面拿到这个文件,ssh cat 直接就拿到字节流了,scp 还得再生成一个临时文件;

    但是问题都是:

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

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

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

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

    ubuntu19.04

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


    $ composer require degagne/libssh2

    ```

    齐活!
    mYYnSmiTEQWcCwAr
    mYYnSmiTEQWcCwAr
    Jan 30, 2020❤️3
    11
    直接 sshfs 把远程服务器的目录挂载不就完事了?
    winglight2016
    winglight2016
    Jan 31, 2020
    12
    @cy97cool 还有这种操作,学习了!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1774 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 17:21 · PVG 01:21 · LAX 09:21 · JFK 12:21
    ♥ Do have faith in what you're doing.