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

2020-01-30 18:43:51 +08:00
 phpfpm

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 能支持这个需求吗?

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

但是问题都是:

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

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

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

或者按照楼上所说,libssh。
superrichman
2020-01-30 19:52:55 +08:00
用 python 的 paramiko 模块,能执行 shell 命令也可以下载文件,写代码建立连接一直不关就好了
phpfpm
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
2020-01-30 20:58:31 +08:00
直接 sshfs 把远程服务器的目录挂载不就完事了?
winglight2016
2020-01-31 09:30:05 +08:00
@cy97cool 还有这种操作,学习了!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/641049

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX