trzsz / trzsz-go

trzsz-go is the go version of trzsz, makes all terminals that support local shell to support trzsz ( trz / tsz ).
https://trzsz.github.io/go
MIT License
884 stars 53 forks source link

运行 trz 报错 #12

Closed nep-0 closed 2 years ago

nep-0 commented 2 years ago
illegal base64 data at input byte 36
goroutine 1 [running]:
runtime/debug.Stack()
        /usr/lib/go-1.18/src/runtime/debug/stack.go:24 +0x65
github.com/trzsz/trzsz-go/trzsz.NewTrzszError({0xc00001c240, 0x40}, {0xc0000148cc, 0x4}, 0x1)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/comm.go:171 +0x272
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvCheck(0xc000039400?, {0x55619b, 0x4}, 0xe0?, 0x7fdc1064d090?)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:197 +0x152
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvInteger(0x10?, {0x55619b?, 0xc000010bd0?}, 0x0?)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:208 +0x25
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvFileSize(0xc000010bd0?, {0x0?, 0x0})
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:751 +0x3f
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvFiles(0xc00004c240, {0xc0000163c0, 0x13}, {0x0?, 0x0})
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:829 +0x4ef
github.com/trzsz/trzsz-go/trzsz.recvFiles(0xc00004c240?, 0xc000062cc0, 0x1e?, 0x3?)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/trz.go:90 +0x312
github.com/trzsz/trzsz-go/trzsz.TrzMain()
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/trz.go:172 +0x865
main.main()
        /build/trzsz-z81gqQ/trzsz-0.1.8/cmd/trz/main.go:33 +0x19

服务端 OS: Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-77-generic x86_64) 服务端版本: trzsz-go 0.1.8

客户端 OS: Windows 11 Professional 21H2 客户端版本: trzsz-go 0.1.8

lonnywong commented 2 years ago

你是用了 msys2 或者 cygwin 的 ssh 吧?这些从 linux 直接迁移过来的 ssh 有问题导致的。

windows 有一个自带的 OpenSSH ,是专门针对 windows 进行修改过的,使用 C:\Windows\System32\OpenSSH\ssh.exe 这个就可以了。

也可以参考 https://github.com/trzsz/trzsz-go/issues/4#issuecomment-1148591047 另外安装个新版本。

nep-0 commented 2 years ago

用了 C:\Windows\System32\OpenSSH\ssh.exe,成功了一次,后来还是报错。

PS C:\Users\xxx> trzsz C:\Windows\System32\OpenSSH\ssh.exe ubuntu@62.xxx.xxx.xxx
ubuntu@62.xxx.xxx.xxx's password:
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-77-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat 09 Jul 2022 09:32:21 AM CST

  System load:                      0.xx
  Usage of /:                       xx% of xxGB
  Memory usage:                     xx%
  Swap usage:                       xx%
  Processes:                        xx
  Users logged in:                  xx
  IPv4 address for br-29a132d78afa: 172.xxx.xxx.xxx
  IPv4 address for cni0:            10.xxx.xxx.xxx
  IPv4 address for docker0:         172.xxx.xxx.xxx
  IPv4 address for eth0:            172.xxx.xxx.xxx

Last login: Sat Jul  9 09:31:38 2022 from 117.xxx.xxx.xxx
ubuntu@VM-16-6-ubuntu:~$ trz
Received xxx.json to /home/ubuntu
ubuntu@VM-16-6-ubuntu:~$ trz
illegal base64 data at input byte 40
goroutine 1 [running]:
runtime/debug.Stack()
        /usr/lib/go-1.18/src/runtime/debug/stack.go:24 +0x65
github.com/trzsz/trzsz-go/trzsz.NewTrzszError({0xc00001a0c0, 0x40}, {0xc0000122f8, 0x4}, 0x1)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/comm.go:171 +0x272
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvCheck(0xc000041ca0?, {0x55616b, 0x4}, 0x1?, 0x1?)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:197 +0x152
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvString(0xc00004a240?, {0x55616b?, 0xc?}, 0x0?)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:231 +0x25
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvExit(...)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:391
github.com/trzsz/trzsz-go/trzsz.recvFiles(0xc00004a240?, 0xc000060cc0, 0x1e?, 0x3?)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/trz.go:95 +0x348
github.com/trzsz/trzsz-go/trzsz.TrzMain()
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/trz.go:172 +0x865
main.main()
        /build/trzsz-z81gqQ/trzsz-0.1.8/cmd/trz/main.go:33 +0x19

ubuntu@VM-16-6-ubuntu:~$ trz
illegal base64 data at input byte 28
goroutine 1 [running]:
runtime/debug.Stack()
        /usr/lib/go-1.18/src/runtime/debug/stack.go:24 +0x65
github.com/trzsz/trzsz-go/trzsz.NewTrzszError({0xc00001a240, 0x40}, {0xc000012950, 0x4}, 0x1)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/comm.go:171 +0x272
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvCheck(0xc000037400?, {0x55619b, 0x4}, 0x30?, 0x7f0022cdd090?)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:197 +0x152
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvInteger(0x10?, {0x55619b?, 0xc000010be0?}, 0x0?)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:208 +0x25
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvFileSize(0xc000010be0?, {0x0?, 0x0})
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:751 +0x3f
github.com/trzsz/trzsz-go/trzsz.(*TrzszTransfer).recvFiles(0xc00004a240, {0xc0000127b0, 0xc}, {0x0?, 0x0})
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/transfer.go:829 +0x4ef
github.com/trzsz/trzsz-go/trzsz.recvFiles(0xc00004a240?, 0xc000060cc0, 0x1e?, 0x3?)
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/trz.go:90 +0x312
github.com/trzsz/trzsz-go/trzsz.TrzMain()
        /build/trzsz-z81gqQ/trzsz-0.1.8/trzsz/trz.go:172 +0x865
main.main()
        /build/trzsz-z81gqQ/trzsz-0.1.8/cmd/trz/main.go:33 +0x19
lonnywong commented 2 years ago

看看 ssh 是什么版本的 C:\Windows\System32\OpenSSH\ssh.exe -V ?

或者从 https://github.com/PowerShell/Win32-OpenSSH/releases 这里下载个新的 ssh 试试?

如果还是不行,看来我要抽空装个 Windows 11 看看( 我现在用的是 Window 10 )。

nep-0 commented 2 years ago

OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2

lonnywong commented 2 years ago

ssh 版本跟我的一样的,看来我要抽空搞个 Windows 11 看看了。

lonnywong commented 2 years ago

@nep-0 方便抓一下日志,发到我的邮箱不?

1、trzsz -t C:\Windows\System32\OpenSSH\ssh.exe ubuntu@62.xxx.xxx.xxx 登录,注意加上 -t。 2、在服务器上执行 echo -e '\x3CENABLE_TRZSZ_TRACE_LOG\x3E',你会看到输出一个日志路径( 在 windows 上的 )。 3、执行 trz 上传一个可以公开的文件,复现出错误来。 4、在服务器上执行 echo -e '\x3CDISABLE_TRZSZ_TRACE_LOG\x3E' 会停止写日志,并且会再次输出日志路径。 5、在 windows 上找到日志文件,发送到我的邮箱 lonnywong@qq.com 。

nep-0 commented 2 years ago

已发送。

lonnywong commented 2 years ago

感谢!

分析了下: 服务端输出的是 #SUCC:eJzy8XR29Qt21TMCBAAA//8MnwJk!,经过了 windows 的 PowerShell,分了三次输出:

  1. \r\n\x1b[90C
  2. #SUCC:eJzy8XR29Qt21TMCBAAA//8
  3. \r\n\x1b[25;119H8MnwJk!\r\n\x1b[6C

这其实是多了一些 vt100 的控制字符,一般以 \x1b[ 开头,以某个字母结束,如 \x1b[25;119H

我把这些多出来的东西做了过滤,得到了 #SUCC:eJzy8XR29Qt21TMCBAAA//88MnwJk!,比服务端的真实输出多了一个 8 ,所以导致了报错。

我也不懂怎么样还原出服务端真实的输出了,不知道为什么会重复输出了 8

关于 vt100 可以网上搜一下,https://en.wikipedia.org/wiki/ANSI_escape_code

我的处理代码: https://github.com/trzsz/trzsz-go/blob/2b984b83f6063eed2b50b1a68fcb651202b8f285/trzsz/buffer.go#L160-L170

lonnywong commented 2 years ago

可能是 Windows 或者 PowerShell 的 bug 。可以试试其他的终端:

1、cmd ,用法和 PowerShell 相同。

2、cygwin,用法:trzsz "C:\Windows\System32\OpenSSH\ssh.exe" x.x.x.x

3、MSYS2git bash,用法:winpty trzsz /c/Windows/System32/OpenSSH/ssh.exe x.x.x.x

lonnywong commented 2 years ago

@nep-0

可以编译一个最新的看看(做了一些调整,不知有没有用):

git clone https://github.com/trzsz/trzsz-go.git
cd trzsz-go
GOOS=windows go build ./cmd/trzsz

trzsz.exe 就在当前 trzsz-go 目录下。

lonnywong commented 2 years ago

我安装 Win11 研究了一下规律,发现每输出一行都会将光标移到上一行的行末,然后重复输出一个字符。

我把那重复的字符过滤掉之后,本地测试是解决了。

可以自己编译一个 trzsz.exe 试试看。

git clone https://github.com/trzsz/trzsz-go.git
cd trzsz-go
go build ./cmd/trzsz
lonnywong commented 2 years ago

v0.1.9 已解决。