Closed xiebruce closed 1 year ago
逐一回答一下:
逐一回答一下:
- 一开始只有 python 版,只支持 iTerm2。后来有很多人提出想支持其他终端,如 electerm 和 tabby 等,于是有了 js 版,顺便支持了浏览器 webshell。也有很多人想要支持原生终端,如 ubuntu 自带那个,一开始没想到解决办法,后来想到了,就有了 go 版。
- mac 上只需要安装 python 版,不要安装 go 版,服务器上可以安装 go 版,三个版本是互相兼容的。
- iTerm2 进度条依赖其 python api,用 go 比较麻烦,除非用 zenity 进度条。不过我觉得文本进度条更好。
- t 与 tmux 有关系,我写 trzsz 的初衷是为了解决 tmux 不兼容 lrzsz 的问题。
- 因为你同时安装了 trzsz 和 trzsz-go,他们都有相同的 trz 和 tsz 程序,冲突了。自己 brew link 一下就好。
- -d 指定后,就不用每次下载都弹出对话框了,会直接下载到指定目录。
- 当文件较多,并且较长时,确实你这样更好。有空可以提个 PR 过来。
感谢大佬逐一回复,辛苦辛苦,其它都明白了,但是对于第6点,我有点明白了,虽然可以不填而直接在代码中获取Downloads文件夹,但如果这样的话,万一我想弹窗,而不想默认保存到“下载”文件夹,还是得传个参数,也就是无论如何都要传参数(或者写在配置文件中),所以还不如就直接用指定文件夹这个参数了。
关于第 6 点,可能也有人想直接下载到其他文件夹,而不是“下载”这一个。
关于第 6 点,可能也有人想直接下载到其他文件夹,而不是“下载”这一个。
确实是的。
大佬你好,我还有个疑问,不管是lrzsz还是你的trzsz,工作原理都是:
1、是这样的。 2、trz / tsz 就是一个普通的控制台程序,有 stdin 和 stdout,你按一下键盘,stdin 就可以读入一个字符,你在程序中 print 一个字符串,终端就能显示出来。trz / tsz 用的就是这个 stdin 和 stdout 传输文件的。上传就相当于按了非常多的键盘,下载就相当于显示了非常多的字符。 3、你仔细看,trz 和 tsz 输出的特殊字符串有一点点不一样的。 4、同2,每个 tab 都有自己的 stdin 和 stdout 。
“上传就相当于按了非常多的键盘,下载就相当于显示了非常多的字符”,明白了,原来是这样。
果然是不一样的
# trz
::TRZSZ:TRANSFER:R:1.1.0:8474374665700
# trz -d
::TRZSZ:TRANSFER:D:1.1.0:8474437510600
# tsz
::TRZSZ:TRANSFER:S:1.1.0:8474379056700
# regexp
:(:TRZSZ:TRANSFER:[SRD]:\d+\.\d+\.\d+:\d+)
这下我明白了,这三个都符合正则,所以都会触发自动调用python脚本,而调用的时候是/usr/local/bin/trzsz-iterm2 -p text \1
这样调用的,最后一个\1
我昨天配置的时候没明白是什么,现在才知道是正则捕获,把正则括号中捕获的内容传到python脚本中,于是python就可以判断到底是在进行哪种操作了,妙啊👍
关于拖放上传问题,这是我的配置
/usr/local/opt/trzsz/libexec/bin/trzsz-iterm2 -p text dragfiles \(filenames)
我试了一下:
trz -d
,如果是文件,自动在终端执行trz
;trz -d
或trz
会输出对应的一串字符串,然后iTerm2 trigger识别到这个字符串,然后呢,它就弹出选择文件窗口让我选择文件;这样的话,貌似只用“拖放操作”来自动输入trz/trz -d
,而后还是要我选择文件上传,并没有直接上传我拖放的文件(夹),按道理,你的python脚本识别到dragfiles参数后,不应该打开窗口让我选择文件,而是直接上传iTerm2通过\(filenames)
传进来的文件夹(夹)路径呀。
另外有一点不明白的是这个文档中,有以下描述
我试了通过trzsz --dragfile ssh x.x.x.x
登录服务器,然后再拖放文件到已登录到服务器的终端界面,它还是弹出让我选择文件。
而且我不太明白为什么需要通过在ssh登录前面加上trzsz --dragfile
,也许这是其它终端使用的?而对于iTerm2,它本身已经可以通过拖放来自动执行我们预设的命令,且命令后面跟上 dragfiles 表示这是拖放操作,而且\(filenames)
也把拖放的文件(夹)路径传进来了,所以python脚本那儿完全可以判断出来是拖放操作,直接对传进来的文件(夹)进行上传,而不是弹窗让用户选择要上传什么文件。
trzsz-go 跟 iTerm2 没有关系,用 iTerm2 的 mac 最好不要安装 trzsz-go ,更没必要执行什么 trzsz --dragfile ssh
之类的。
你现在搞的太乱了。
关于 iTerm2 拖动不能上传的问题,你的 iTerm2 是什么版本?服务器的网络质量怎么样?
你试试将这里的 20
和 0.05
改大一些,看行不行?
我只是一开始不知道所以两个都安装了,但是我用的时候用的就是trzsz呀,你看我在拖放触发执行的脚本那边填的是:
/usr/local/opt/trzsz/libexec/bin/trzsz-iterm2 -p text dragfiles \(filenames)
> ls -l /usr/local/opt/trzsz
lrwxr-xr-x 1 bruce admin 21 May 21 17:25 /usr/local/opt/trzsz@ -> ../Cellar/trzsz/1.1.2
> ls -l /usr/local/opt/trzsz/libexec/bin/trzsz-iterm2
-rwxr-xr-x 1 bruce admin 1019 May 21 17:25 /usr/local/opt/trzsz/libexec/bin/trzsz-iterm2*
而且我实际使用的时候并没有用trzsz --dragfile ssh
,只是看到了,就试试而已,实际使用我就是直接:ssh user@xx.xx.xx.xx
这样登录的。
我后来测试了,是iterm的问题,我用的是昨天下载的最新的版本iTerm2-3_5_20230519-nightly.zip,我又试了iTerm2-3_5_20230503-nightly.zip,这个就没问题。
然后我又换回当前(2023-05-22)最新版本:iTerm2-3_5_20230522-nightly.zip,拖放上传同样会弹出让我选择,我按你说的把这里改大了几次,还是不能解决
发现这个报错
Traceback (most recent call last):
File "/usr/local/Cellar/trzsz/1.1.2/libexec/lib/python3.11/site-packages/trzsz/iterm2/main.py", line 297, in drag_files_to_upload
trigger_match = re.search(trzsz_trigger_regex, output.decode('ascii'))
^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 188: ordinal not in range(128)
找到问题了,是我服务器安装了zsh和ohmyzsh的原因,我服务器切换到bash,拖放上传就成功了,现在我用今天(2023-05-22)的nightly build也没事了。
上面那个报错应该也是在zsh上才有,现在我在bash上拖了几次上传,没报错,能正常上传。
你把 ascii
换成 latin1
试试?
trigger_match = re.search(trzsz_trigger_regex, output.decode('latin1'))
你把
ascii
换成latin1
试试?trigger_match = re.search(trzsz_trigger_regex, output.decode('latin1'))
改成latin1
后成功了!目前用的Build 3.5.20230522-nightly,拖放上传正常,在zsh下也不报错了。
“也有很多人想要支持原生终端,如 ubuntu 自带那个,一开始没想到解决办法,后来想到了,就有了 go 版”
我又有一个不明白的问题:支持Ubuntu原生终端需要go版才可以吗?反正都是识别出那串特殊字符串后调用本地的命令,这命令用go写和用python写,不都是被调用执行么?是不是要弹出选择文件窗口必须用go才能实现,用python无法实现?
问题好像有点多,但确实没明白而又想知道为什么,所以就来问了🤣
python 应该也能做,但我想支持多平台,特别是 Windows。go 版一个 trzsz.exe 程序会比 python 的安装和使用简单很多。
python 应该也能做,但我想支持多平台,特别是 Windows。go 版一个 trzsz.exe 程序会比 python 的安装和使用简单很多。
明白了,这个确实是,go的好处就是单个文件搞定,啥也不依赖,不拖家带口,如果不是iTerm2用的python api,你都可以不用python版了,毕竟trigger调用python命令跟调用go可执行文件是一样的,只不过可执行文件首次使用要允许一下权限。
我又想出一个问题:
服务器端要接收文件夹时,需要trz -d
,那么反过来,客户端也应该要trz -d
吧?可是,服务器端tsz
输出的那个字符串中,貌似并不包括它是要“发送文件夹”还是“发送文件”的信息,所以客户端应该是无法区别的吧?无法区别的话,客户端怎么知道要使用trz
还是trz -d
来接收呢?
还是说,客户端会统一使用trz -d
,这样无论文件夹还是文件都可以接收?可是如果这样的话,我感觉这个-d
就没必要存在的,反正不分文件和文件夹。非要说它存在的一个意义,可能是命令界的传统就是加-r
(或-d
)来表示对目录进行操作,有这个-d
可以让用户确定它确实是可以接收文件夹的。
在握手时有个字段标识是否包含目录。
alias tsz="tsz -d"
。我不将 -d 作为默认的,是为了避免参数写错了,本来想下载文件的,却写了文件夹,然后自动下载了大量小文件。如果有人喜欢 -d 作为默认的,可以设置
alias tsz="tsz -d"
。
这么说确实有道理,这我就明白为什么了
不过目前你这个在Mac上打开的文件选择窗口确实可以选文件和文件夹,但其实Mac是可以指定只能选文件或只能选文件夹的,我用applescript就可以指定,可能py程序无法指定吧。不过能选两种更好,更方便!
把to choose folder
换成to choose file
就是只能选文件,而choose folder只能选文件夹
tell application "iTerm"
set thefile to choose folder with prompt "Files save to:"
set thefile to POSIX path of theFile
end tell
mac 上,-d 时,现在也可以同时选文件和文件夹的吧,我忘了,你可以测试一下。 主要是 Windows 还是 Linux 不行,记不太清了。
我试了,确实是这样的,trz -d
时,可以单选文件,也可以选目录,而trz
时就只能单选文件了。
另外你说
python 应该也能做,但我想支持多平台,特别是 Windows。go 版一个 trzsz.exe 程序会比 python 的安装和使用简单很多。
那是不是说,windows端和Linux端(比如ubuntu) 是只要用到go版,完全不需要python版吗?因为只有go版本的话,好像就跟lrzsz类似,对应terminal的触发器没法直接调用trz
或tsz
吧?触发器应该都是调用一个小脚本,然后小脚本收集到上传路径之类的,再去调用trz
或tsz
的吧?不知道在windows terminal和ubuntu是不是用小脚本(py或shell)调的go版本tsz
/trz
?
对的,Windows 和 Linux 一般用 go 版就可以了。当然 js 和 py 版也是能用的。 现在这个时间点,go 版领先于 py 和 js 版,支持流水线,速度快不少。 触发器这个只有 iTerm2 支持,其他都不支持。有些终端内置支持 trzsz,如 tabby 和 electerm。对于没有内置支持 trzsz 的,又不像 iTerm2 这样有触发器的,只能用 trzsz-go ,用 trzsz ssh 登录,这样 trzsz 就接管了 ssh 的输入和输出,就可以实现了。 上周末想到了个新办法,写一个支持 trzsz 的 ssh ,见 https://github.com/trzsz/trzsz-ssh ,这样 trzsz ssh 就变成 tssh 就好了。这个的重点是解决了 Windows 中 trzsz ssh 上传慢的问题。
这下我终于明白为什么trzsz-go有trzsz ssh
这种用法了,其实我觉得python版可以不要了,不要了之后,无非就是写个小脚本来让iTerm2的触发器调用,主要是用于处理触发器和拖放上传的回调,把上传路径获取到,小脚本最终还是调用trzsz-go。
而这个小脚本用什么来写呢?理论上当然可以用bash shell,但为了实现上传进度条显示,还是必须用python来写,用python来写也比shell脚本方便的多,而且现在都是内置python3了吧?也没必要打包带上python了(直接一个单文件就可以),能用这玩意儿的,怎么也有点小基础吧,找不到python3,可以自己手动把py脚本里面的#!//usr/bin/env python
改成#!//usr/bin/env python3
呀,这样的话,由于python并没有实现具体功能,而只是调用trzsz-go,所以相当于只维护了一个go版本了,py只要一个单文件就行,只是负责调用一下go版本罢了,少一个语言版本也可以少花点时间哈哈。
不过这都是我设想的,其实我也好奇python是怎么调用的iTerm2 api的?目前的话,我看你这边只是trigger自动调用了trzsz-iterm2
而已,这样就能实现调用api吗?我总感觉不能吧,比如那个文本进度条,具体是怎么去实现的呢?是在你的python代码中调用iTerm2给出的接口?可是就只是被iTerm2触发器自动调用一下,你就能用py调用iTerm2的接口吗?
你要是只是想用 go 版 trzsz,你完全可以不用 iTerm2 触发器,把 iTerm2 触发器全关闭了,在 mac 上 alias ssh="trzsz ssh"
就可以了。这就完全不需要 python 版了。
不过,我还是会维护 python 版 trzsz 的,我自己用的就是 python 版。因为我在用 iTerm2 tmux Integration,这个现在只能用触发器这种方式,要不然就得去解释 tmux 命令模式,多个窗口时挺复杂的,暂时没空搞。
如果你用 python 或脚本调起 go ,那 go 也得实现 python 里的逻辑,这些逻辑主要集中在:https://github.com/trzsz/trzsz/blob/main/trzsz-iterm2/trzsz/iterm2/main.py ,这里面的逻辑是 python 特有的,我觉得没必要再用 go 重写一遍。你不用 iTerm2 tmux Integration 的话,只要 alias ssh="trzsz ssh"
就可以只用 go 版了。
“这里面的逻辑是 python 特有的”
呃...我大概看了一下,没看出个所以然来。你说python特有的,是指必须用python写才能实现,其它语言都不行吗?是因为里面调用了iTerm2的python api吗?
另外我发现一个问题,我发现我拖放文件到本地,它会自己传给自己了(从“下载”文件夹又传回“下载”文件夹),我感觉应该识别一下我拖的是不是ssh登录后的界面,如果不是,那说明拖的是本地,那就还是返回路径(就像没开启拖放功能一样)。
这个不好识别。建议你用 go 版,alias ssh="trzsz -d ssh"
,不要配置 iTerm2,这样不会有这个问题。
呃...我大概看了一下,没看出个所以然来。你说python特有的,是指必须用python写才能实现,其它语言都不行吗?是因为里面调用了iTerm2的python api吗?
只有 python 版有提供 trzsz-iterm2
这个程序,go 版没有,我不认为有必要用 go 再实现一个 trzsz-iterm2
程序。
语言 \ 程序 | trz |
tsz |
trzsz |
trzsz-iterm2 |
---|---|---|---|---|
Python | √ | √ | X | √ |
Go | √ | √ | √ | X |
呃...我大概看了一下,没看出个所以然来。你说python特有的,是指必须用python写才能实现,其它语言都不行吗?是因为里面调用了iTerm2的python api吗?
只有 python 版有提供
trzsz-iterm2
这个程序,go 版没有,我不认为有必要用 go 再实现一个trzsz-iterm2
程序。语言 \ 程序
trz
tsz
trzsz
trzsz-iterm2
Python √ √ X √ Go √ √ √ X
你说的这个我是知道的,我只是想问一下,trzsz-iterm2的功能,是不是一定要python才能实现?还是说其实go也能实现,只是觉得没必要再去重复实现一遍?
这个不好识别。建议你用 go 版,
alias ssh="trzsz -d ssh"
,不要配置 iTerm2,这样不会有这个问题。
明白了,本来觉得拖放功能挺好的,但是用这个就没法用拖放功能了 😂
我发现我登录服务器后(我走代理登录的服务器),在服务器上输入命令(还没有按回车),就是随意输入字符也好,它的回显速度,并没有在本地终端速度快,是不是只要我一输入字符,这个字符就马上被传到了服务器,然后再传回来,最后才显示出来,因此我才感受到有“延迟感”?(因为之前我以为是按回车后,我输入的字符才会被传送到服务器)
alias ssh="trzsz -d ssh"
加了 -d
是有拖放功能的。
除了 python api 部分,用 go 都是能实现的。
对的,延迟感跟 ping 的耗时有很大关系。
alias ssh="trzsz -d ssh"
加了-d
是有拖放功能的。除了 python api 部分,用 go 都是能实现的。
对的,延迟感跟 ping 的耗时有很大关系。
啊,原来trzsz
的-d
竟然是“dragfile”而不是“directory”,我开始还以为是“directory”呢。我现在理解的是,python版本存在的原因,仅仅是因为你需要用iTerm2 tmux Integration功能,毕竟你当初写这个的原因就是为了支持iTerm2 tmux Integration,如果不用iTerm2 tmux Integration,那么用trzsz-go也是可以用tmux的,只是不能用iTerm2集成的tmux而已,这么理解不知道对不对?
另外有一个问题就是:我看trzsz-ssh的代码量相比trzsz-go,少很多,那么trzsz-ssh是否依赖于trzsz-go?还是说它是完全独立的?
对,是。
@xiebruce 第 7 点已实现,可以源码安装最新的试试:
go install github.com/trzsz/trzsz-go/cmd/trz@5627712
go install github.com/trzsz/trzsz-go/cmd/tsz@5627712
go install github.com/trzsz/trzsz-go/cmd/trzsz@5627712
感谢 @amo996 的贡献。
@xiebruce 第 7 点已实现,可以源码安装最新的试试:
go install github.com/trzsz/trzsz-go/cmd/trz@5627712 go install github.com/trzsz/trzsz-go/cmd/tsz@5627712 go install github.com/trzsz/trzsz-go/cmd/trzsz@5627712
感谢 @amo996 的贡献。
测试是可以了,不过不知道为什么服务器trz -d
时,本地现在只能选文件夹,不能选文件了(trzsz ssh user@ip
方式登录的),我又切换回之前的版本(1.1.0),还是这样,没有重启系统测试,其他人可以留意一下是不是跟我一样。
系统:macOS Big Sur 11.5.1 (20G80)
@xiebruce 我也是只能选目录,不能同时选文件和目录了,还没找到什么原因。
你从 releases 那里下载一个以前编译出来的试试?
@xiebruce 看看是不是 iTerm2 触发器那个可以同时选文件和目录?go 版用的库好像是一直都不支持。
也有很多人想要支持原生终端,如 ubuntu 自带那个,一开始没想到解决办法,后来想到了,就有了 go @lonnywong
I used to think add lrzsz support to vte-based terminals. After some dig, I recognized it's not easy to implement, cause vte does not provide an interface to handle stdio streams of the pty.
The idea of relay stdio is very clever. I have previously made a small tool for openssh session keepalive (from Network changes or outages), which is similar to the idea of relaying. (some code piece is generated by gpt) https://github.com/yurenchen000/ssh-keep
I'm still thinking about having a session retention like tmux that allows the client to exit and re-enter. //maybe modify openssh, or implement a new ssh server/client.
@yurenchen000 Try https://github.com/trzsz/trzsz-ssh
@lonnywong thanks for your reply I came from here 😹 I'm trying the dragfile upload feature and related code (on ubuntu, terminator / gnome-terminal)
about session restore (from client restart) no clues found yet
搞好了,我是macOS下的iTerm2,有进度条,比lrzsz好多了
问题
1、为什么同时写两个语言的版本?因为如果是我写的话,肯定集中精力写好一种语言的,因为对用户来说,无论哪种语言都一样用; 2、go版本似乎无法独立使用,因为
trzsz-iterm2
是python写的,它好像是依赖于python版本的trzsz,我个人喜欢go版,希望go版本自带trzsz-iterm2
,不要依赖于python版; 3、进度条功能是否由python实现,或者说则python调用iTerm2的api实现?是否一定需要python才能实现进度条而不能用其它语言? 4、为什么叫trzsz,t是什么意思?terminal吗?(没有别的意思,只是单纯好奇为什么是t)? 5、在trzsz-iterm2文档中,which trzsz-iterm2
找不到trzsz-iterm2
,我是搜索整个/usr/local/Cellar/
才找到在以下路径我是同时用brew安装了python版本和go版本,不过由于两个都要链接到
/usr/local/bin/
会冲突,所以我先brew unlink trzsz
,然后再brew link trzsz-go
,不知道是不是跟这个有关。 6、-d
指定下载目录完全没必要吧,python和go都可以轻易的获取系统的家目录(不行用$(whoami)
也能找到家目录)7、目前trz传完后输出是这样的
由于文件名长,这样并不好看,不如这样:
tsz同理
换成