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

phpfpm 22天前 23

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)
  • ysc3839 18天前
    引用 2
    用 SCP 协议不行吗?
  • 楼主 phpfpm 18天前
    引用 3
    @ysc3839 行,主要是我是要在一个别的进程里面拿到这个文件,ssh cat 直接就拿到字节流了,scp 还得再生成一个临时文件;

    但是问题都是:

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

    自己实现的话方案应该是找一个 ssh 库,自己读取输出识别编码。
  • 楼主 phpfpm 18天前
    引用 8
    @Buges 愿闻其详!
    https://github.com/degagne/libssh2
    @publicccc

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

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

    ubuntu19.04

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


    $ composer require degagne/libssh2

    ```

    齐活!
  • cy97cool 18天前
    引用 12
    直接 sshfs 把远程服务器的目录挂载不就完事了?
  • winglight2016 18天前
    引用 13
    @cy97cool 还有这种操作,学习了!
  • 游客
    14
返回