trzsz / trzsz-ssh

trzsz-ssh ( tssh ) is an ssh client designed as a drop-in replacement for the openssh client. It aims to provide complete compatibility with openssh, mirroring all its features, while also offering additional useful features. Such as login prompt, batch login, remember password, automated interaction, trzsz, zmodem(rz/sz), udp mode like mosh, etc.
https://trzsz.github.io/ssh
MIT License
1.74k stars 102 forks source link

tssh无法用key连接,ssh正常,请问是哪里没正确吗? #103

Closed fengmikaelson closed 7 months ago

fengmikaelson commented 7 months ago

请教一下~

用ssh可以正常识别登录,并跳转到otp 换tssh就一直失败 Host Jumpserver HostName xxx.com Port 2222 User xxx

!!IdentityFile /Users/xxx/.ssh/id_rsa.pub

➜ ~ ssh -p2222 -i .ssh/id_rsa.pub xxx@xxx.com xxx Please Enter MFA Code. (xxx@xxx.com) [OTP Code]: ^C ➜ ~ tssh -p2222 -i .ssh/id_rsa.pub xxx@xxx.com --debug debug: /Users/xxx/.tssh.conf does not exist debug: open config [/Users/xxx/.ssh/config] success debug: decode config [/Users/xxx/.ssh/config] success debug: open config [/etc/ssh/ssh_config] success debug: decode config [/etc/ssh/ssh_config] success debug: new ssh agent client [/private/tmp/com.apple.launchd.SMeXPhhmdg/Listeners] success Warning: parse private key [.ssh/id_rsa.pub] failed: ssh: no key found debug: add auth method: keyboard interactive authentication debug: add auth method: password authentication debug: add UserKnownHostsFile: /Users/xxx/.ssh/known_hosts debug: UserKnownHostsFile [/Users/xxx/.ssh/known_hosts2] does not exist debug: GlobalKnownHostsFile [/etc/ssh/ssh_known_hosts] does not exist debug: GlobalKnownHostsFile [/etc/ssh/ssh_known_hosts2] does not exist debug: user declared ciphers: [chacha20-poly1305@openssh.com aes128-ctr aes192-ctr aes256-ctr aes128-gcm@openssh.com aes256-gcm@openssh.com aes128-cbc aes192-cbc aes256-cbc] debug: client supported ciphers: [chacha20-poly1305@openssh.com aes128-ctr aes192-ctr aes256-ctr aes128-gcm@openssh.com aes256-gcm@openssh.com aes128-cbc] debug: login to [xxx.com], addr: xxx.com:2222 debug: extended config [/Users/xxx/.ssh/password] does not exist debug: no extended config [encPassword] for [xxx.com] debug: no extended config [Password] for [xxx.com] xxx@xxx.com's password:

不知道哪里出问题了,所以来请教一下。

lonnywong commented 7 months ago

#!!IdentityFile 这个配置错了,openssh 认为是注释,所以没问题,tssh 认为不是注释,所以有问题。

IdentityFile 应该配置的是私钥,你配置了个公钥,是不对的。

fengmikaelson commented 7 months ago

#!!IdentityFile 这个配置错了,openssh 认为是注释,所以没问题,tssh 认为不是注释,所以有问题。

IdentityFile 应该配置的是私钥,你配置了个公钥,是不对的。

谢谢抽空回复。 那个刚才我乱改的,贴错了,之前的是这样的。

不管我贴私钥还是公钥,都不行。。。但是用ssh都可以正常连接,就很奇怪。。。

➜ ~ cat ~/.ssh/config Include ~/.orbstack/ssh/config

Host Jumpserver HostName xxx.com Port 2222 User xxx IdentityFile /Users/xxx/.ssh/id_rsa

➜ ~ tssh -p2222 -i ~/.ssh/id_rsa xxx@xxx xxx@xxx.com's password:

lonnywong commented 7 months ago

tssh -v 看看是不是最新的版本?你这种是优先走到了密码认证,很旧的版本是存在这个问题的,我已经修了应该有几个版本了。

fengmikaelson commented 7 months ago

tssh -v 看看是不是最新的版本?你这种是优先走到了密码认证,很旧的版本是存在这个问题的,我已经修了应该有几个版本了。

➜ ~ tssh -V trzsz ssh 0.1.19

我是mac,通过brew安装的。

lonnywong commented 7 months ago

奇怪了,你加多一行配置试试:

    PasswordAuthentication no
fengmikaelson commented 7 months ago

PasswordAuthentication no

一样的情况。。。 ➜ ~ cat ~/.ssh/config Host Jumpserver HostName xxx.com Port 2222 User xxx IdentityFile /Users/xxx/.ssh/id_rsa PasswordAuthentication no ➜ ~ tssh -p2222 -i /Users/xxx/ZX/Jumpserver/id_rsa xxx@xxx.com xxx@xxx.com's password:

lonnywong commented 7 months ago

tssh -p2222 -i /Users/xxx/ZX/Jumpserver/id_rsa -o PasswordAuthentication=no xxx@xxx.com

这样登录试试。

lonnywong commented 7 months ago

另外,你在命令行中用的是 xxx@xxx.com,那在配置中的 Host 就应该是 Host xxx@xxx.com

你现在的配置是 Host Jumpserver,那在命令行中就应该用 tssh Jumpserver,而不是 tssh xxx@xxx.com

fengmikaelson commented 7 months ago

PasswordAuthentication=no

tssh -p2222 -i /Users/xxx/.ssh/id_rsa -o PasswordAuthentication=no xxx@xxx.com new conn [xxx.com:2222] failed: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

是不是ssh-rsa不支持?

另外,你在命令行中用的是 xxx@xxx.com,那在配置中的 Host 就应该是 Host xxx@xxx.com

你现在的配置是 Host Jumpserver,那在命令行中就应该用 tssh Jumpserver,而不是 tssh xxx@xxx.com

我用过tssh Jumpserver也不行呢,所以我才换tssh -p xxx@xx.com这些来测试,想看看输出内容

lonnywong commented 7 months ago

tssh -p2222 -i /Users/xxx/ZX/Jumpserver/id_rsa -o KbdInteractiveAuthentication=yes xxx@xxx.com

试试这样

fengmikaelson commented 7 months ago

KbdInteractiveAuthentication=yes

➜ ~ tssh -p2222 -i ~/.ssh/id_rsa -o KbdInteractiveAuthentication=yes xxx@xxx.com xxx@xxx.com's password:

还是提示我输密码。。。

lonnywong commented 7 months ago

ssh -vvv 登录,发一下详细的 openssh 日志到我的邮箱 lonnywong@qq.com ?

fengmikaelson commented 7 months ago

ssh -vvv 登录,发一下详细的 openssh 日志到我的邮箱 lonnywong@qq.com

已发送~麻烦你了。

lonnywong commented 7 months ago

你试试 ssh -o PubkeyAuthentication=no xxx 能不能登录的?

你发送的日志,我选出重要的一些:

Authenticated using "publickey" with partial success.
debug1: Authentications that can continue: keyboard-interactive
debug3: start over, passed a different list keyboard-interactive
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup keyboard-interactive
debug3: remaining preferred: password
debug3: authmethod_is_enabled keyboard-interactive
debug1: Next authentication method: keyboard-interactive

看来是先 PubkeyAuthentication,部分成功后,再走到 KbdInteractiveAuthentication 的。

现在 tssh 的实现,是 PubkeyAuthentication、PasswordAuthentication 和 KbdInteractiveAuthentication 三者之一,暂不支持 PubkeyAuthentication + KbdInteractiveAuthentication 这种方式,等有空了我研究一下怎么实现。

fengmikaelson commented 7 months ago

ssh -o PubkeyAuthentication=no

➜ ~ ssh -o PubkeyAuthentication=no -p2222

加上以后让我输密码了

lonnywong commented 7 months ago

ssh -o PubkeyAuthentication=no

➜ ~ ssh -o PubkeyAuthentication=no -p2222

加上以后让我输密码了

你的服务器果然是 PubkeyAuthentication + KbdInteractiveAuthentication 这种认证方式,tssh 暂时是不支持的。

fengmikaelson commented 7 months ago

ssh -o PubkeyAuthentication=no

➜ ~ ssh -o PubkeyAuthentication=no -p2222 加上以后让我输密码了

你的服务器果然是 PubkeyAuthentication + KbdInteractiveAuthentication 这种认证方式,tssh 暂时是不支持的。

估计服务端ubuntu的ssh开启了这两种认证。。。好的吧,期待支持。。。感谢解答

lonnywong commented 7 months ago

在支持之前,你可以这样配置,tssh 就会调起 openssh 来登录,然后借用其通道,你就可以手工输入 otp 登录了。

Host xxx
    ControlMaster auto
    ControlPath ~/.ssh/%n_%h

如果你能通过命令获取到 otp code,或者知道 totp 的密钥,还可以配置自动交互。 如( 这个是知道 totp 的密钥 ):

Host xxx
    ControlMaster auto
    ControlPath ~/.ssh/%n_%h
    #!! CtrlExpectCount 1
    #!! CtrlExpectPattern1 [OTP Code]:
    #!! CtrlExpectSendTotp1 xxxxx

又如( 这个是通过命令 oathtool --totp -b xxxxx 获取 otp code ):

Host xxx
    ControlMaster auto
    ControlPath ~/.ssh/%n_%h
    #!! CtrlExpectCount 1
    #!! CtrlExpectPattern1 [OTP Code]:
    #!! CtrlExpectSendOtp1 oathtool --totp -b xxxxx
fengmikaelson commented 7 months ago

!! CtrlExpectCount 1

#!! CtrlExpectPattern1 [OTP Code]:
#!! CtrlExpectSendOtp1 oathtool --totp -b xxxxx

感谢热情回复。 Host xxx ControlMaster auto ControlPath ~/.ssh/%n_%h 这样倒是成了,可以跳到otp这里了

Host xxx ControlMaster auto ControlPath ~/.ssh/%n_%h

!! CtrlExpectCount 1

#!! CtrlExpectPattern1 [OTP Code]:
#!! CtrlExpectSendOtp1 oathtool --totp -b xxxxx

我加上了这种模式后,输出报错如下: ➜ ~ tssh 🍺 Jumpserver Warning: start control master failed: control master stdout invalid: [78 111 32 80 84 89 32 114 101 113 117 101 115 116 101 100 46 10] Warning: Control socket connect(/Users/xxx/.ssh/id_rsa): Socket operation on non-socket Warning: xxx(这里显示config里配置的user名字) Warning: Please Enter MFA Code. Warning: ControlSocket /Users/xxx/.ssh/id_rsa already exists, disabling multiplexing Warning: dial control socket [/Users/xxx/.ssh/id_rsa] failed: dial unix /Users/xxx/.ssh/id_rsa: connect: socket operation on non-socket xxx@xxx.com's password:(这里会弹出输密码,但是可以回车直接跳过) (xxx@xxx.com) [OTP Code]:(到这里就让我输入otp里,好像没有自动带入成功。。。)

btw: oathtool --totp -b xxxxx 可以正常生成otp code,我测试了,是正确的。

lonnywong commented 7 months ago

ControlPath 是不是配错了?不应该是 /Users/xxx/.ssh/id_rsa 。你再加一次前缀或后缀吧,不要与其他文件的路径重复了。

fengmikaelson commented 7 months ago

ControlPath 是不是配错了?不应该是 /Users/xxx/.ssh/id_rsa 。你再加一次前缀或后缀吧,不要与其他文件的路径重复了。

没用过controlpath,我以为要改成真实路径,我现在照抄你的替换回来了~

Host Jumpserver HostName xxx.com ControlMaster auto ControlPath ~/.ssh/%n_%h Port 2222 User xxx

!! CtrlExpectCount 1

    #!! CtrlExpectPattern1 [OTP Code]:
    #!! CtrlExpectSendOtp1 oathtool --totp -b xxxxxx

输出如下: ➜ ~ tssh 🍺 Jumpserver Warning: start control master failed: control master stdout invalid: [78 111 32 80 84 89 32 114 101 113 117 101 115 116 101 100 46 10] Warning: xiaodong_feng Warning: Please Enter MFA Code. Warning: dial control socket [/Users/xxx/.ssh/Jumpserver_xxx.com] failed: dial unix /Users/mikaelson/.ssh/Jumpserver_xxx: connect: no such file or directory xxx@xxx.com's password: ➜ ~

还是不太行,T-T

lonnywong commented 7 months ago

你执行 ssh -T Jumpserver echo ok 看看输出什么?

fengmikaelson commented 7 months ago

ssh -T Jumpserver echo ok

输出如下 ➜ ~ ssh -T Jumpserver echo ok xxx Please Enter MFA Code. (xxx@xxx.com) [OTP Code]:

lonnywong commented 7 months ago

执行 /usr/bin/ssh -T -oRemoteCommand=none -oConnectTimeout=10 Jumpserver 'echo ok; sleep 10',然后提示你输入 OTP Code 时,你输入正确的,然后看看输出什么?

fengmikaelson commented 7 months ago

/usr/bin/ssh -T -oRemoteCommand=none -oConnectTimeout=10 Jumpserver 'echo ok; sleep 10'

No PTY requested.

lonnywong commented 7 months ago

如果把 -T 去掉,输入正确的 otp code 后,会有什么表现?

fengmikaelson commented 7 months ago

如果把 -T 去掉,输入正确的 otp code 后,会有什么表现?

一样,是No PTY requested.

lonnywong commented 7 months ago

你这服务器有些特殊,不支持没有 pty 的用法。

你可以再加一个 ControlPersist yes,,把 CtrlExpect 前缀那些删了,先用 ssh 登录一次服务器,然后在断网之前,tssh 都能直接登录,无须再次输入 otp code。如果要输入,那就是网络断过了,要用 ssh 再重新登录一次。

fengmikaelson commented 7 months ago

你这服务器有些特殊,不支持没有 pty 的用法。

你可以再加一个 ControlPersist yes,,把 CtrlExpect 前缀那些删了,先用 ssh 登录一次服务器,然后在断网之前,tssh 都能直接登录,无须再次输入 otp code。如果要输入,那就是网络断过了,要用 ssh 再重新登录一次。

我明天到公司了再测试一下,我也忘了什么版本的系统了,可能是ubuntu,也可能是阿里基于centos修改的ali os。。。 我明天看看什么鬼系统 拿来装jumpserver的(一款开源跳板机)

fengmikaelson commented 7 months ago

你这服务器有些特殊,不支持没有 pty 的用法。

你可以再加一个 ControlPersist yes,,把 CtrlExpect 前缀那些删了,先用 ssh 登录一次服务器,然后在断网之前,tssh 都能直接登录,无须再次输入 otp code。如果要输入,那就是网络断过了,要用 ssh 再重新登录一次。

查了下,是阿里自己改的系统,Alibaba Cloud Linux release 3 (Soaring Falcon) 估计瞎定制了一堆东西

ControlPersist yes 验证可行~但是得自己输入otp了,期待更新~暂时先这样吧。。。

lonnywong commented 7 months ago

拿来装jumpserver的(一款开源跳板机)

应该跟操作系统无关,与 2222 端口对应的进程有关。这个端口应该是对应你说的开源跳板机吧?可能它的默认配置就是这样的,同时要求 PubkeyAuthentication + KbdInteractiveAuthentication 两种认证,并且禁止了无 pty 的模式(一般的 ssh 服务器都是默认允许无 pty 的)。

fengmikaelson commented 7 months ago

拿来装jumpserver的(一款开源跳板机)

应该跟操作系统无关,与 2222 端口对应的进程有关。这个端口应该是对应你说的开源跳板机吧?可能它的默认配置就是这样的,同时要求 PubkeyAuthentication + KbdInteractiveAuthentication 两种认证,并且禁止了无 pty 的模式(一般的 ssh 服务器都是默认允许无 pty 的)。

就国产开源的那款jumpserver呗~去年还在他们那看到你提的feature问他们是否考虑接入trzsz呢,我就是那边看到你的 (https://github.com/jumpserver/jumpserver/issues/10679

估计是这里的问题吧 image

lonnywong commented 7 months ago

我安装来玩过,后面有空了再研究一下你遇到的这两个问题。应该不是你上面这个图这里,估计是你配置 otp 那里。

fengmikaelson commented 7 months ago

我安装来玩过,后面有空了再研究一下你遇到的这两个问题。应该不是你上面这个图这里,估计是你配置 otp 那里。

好的,就是厌烦了每次输入otp,想一劳永逸,还是没解决= =

lonnywong commented 7 months ago

@fengmikaelson 那个跳板机的 otp 是在哪里配置的?或者发一下配置的文档。

fengmikaelson commented 7 months ago

@fengmikaelson 那个跳板机的 otp 是在哪里配置的?或者发一下配置的文档。

好像就一个开关,没有设置的地方,打开了就默认开启otp了。 image

文档好像就这一些内容 https://docs.jumpserver.org/zh/v2/admin-guide/authentication/mfa/?h=mfa

lonnywong commented 7 months ago

你自己编译一个来试试( 更新 golang.org/x/crypto 到 v0.22.0 )?步骤:

git clone https://github.com/trzsz/trzsz-ssh.git
cd trzsz-ssh
go get -u ./...
go mod tidy
go build -o bin/ ./cmd/tssh/
./bin/tssh
fengmikaelson commented 7 months ago

https://github.com/trzsz/trzsz-ssh.git

我不确定是不是可以了,我尝试断网了,它也正常跳过otp让我进入了。 Host Jumpserver HostName xxx.xxx.com ControlMaster auto ControlPath ~/.ssh/%n_%h Port 2222 User xxxx

!! CtrlExpectCount 1

    #!! CtrlExpectPattern1 [OTP Code]:
    #!! CtrlExpectSendOtp1 oathtool --totp -b xxx

我删了#!!这些也跳过otp 了= =

lonnywong commented 7 months ago
Host xxx
    ControlMaster auto
    ControlPath ~/.ssh/%n_%h
    #!! CtrlExpectCount 1
    #!! CtrlExpectPattern1 [OTP Code]:
    #!! CtrlExpectSendOtp1 oathtool --totp -b xxxxx

这些配置应该全都不需要。

fengmikaelson commented 7 months ago

IdentityFile /Users/xxx/.ssh/id_rsa

Host Jumpserver HostName xxx.com Port 2222 User xxx IdentityFile ~/.ssh/id_rsa

不行~喊我输密码了,但是可以直接为空跳过,到otp阶段

lonnywong commented 7 months ago

不行~喊我输密码了,但是可以直接为空跳过,到otp阶段

你再加 PasswordAuthentication no 这行配置

fengmikaelson commented 7 months ago

PasswordAuthentication no

new conn [xxx.com:2222] failed: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

lonnywong commented 7 months ago

是用这个重新编译的?要执行 ./bin/tssh Jumpserver 这样登录。

git clone https://github.com/trzsz/trzsz-ssh.git
cd trzsz-ssh
go get -u ./...
go mod tidy
go build -o bin/ ./cmd/tssh/
./bin/tssh
fengmikaelson commented 7 months ago

是用这个重新编译的?要执行 ./bin/tssh Jumpserver 这样登录。

git clone https://github.com/trzsz/trzsz-ssh.git
cd trzsz-ssh
go get -u ./...
go mod tidy
go build -o bin/ ./cmd/tssh/
./bin/tssh

事的 ➜ trzsz-ssh git:(main) ✗ ./bin/tssh Jumpserver new conn [xxx.com:2222] failed: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

lonnywong commented 7 months ago

go.mod 文件中 golang.org/x/crypto 这一行是改了,变成 v0.22.0 了吧?

fengmikaelson commented 7 months ago

golang.org/x/crypto

是的 ➜ trzsz-ssh git:(main) ✗ cat go.mod|grep crypto golang.org/x/crypto v0.22.0

lonnywong commented 7 months ago

我看 https://github.com/golang/go/issues/17889 这个 issue 前几天 close 了,可能只是支持 server side:https://github.com/golang/go/issues/61447

lonnywong commented 7 months ago

不行~喊我输密码了,但是可以直接为空跳过,到otp阶段

非自己编译那个 v0.1.19 是不能到 otp 阶段的?

fengmikaelson commented 7 months ago

不行~喊我输密码了,但是可以直接为空跳过,到otp阶段

非自己编译那个 v0.1.19 是不能到 otp 阶段的?

是的,0.1.19也是这个错误

new conn [xxx.com:2222] failed: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

换./bin/tssh也是

lonnywong commented 7 months ago

能到 otp 阶段,应该就好办了。你去掉 PasswordAuthentication no 这行配置,通过 ./bin/tssh --debug Jumpserver 登录看看,随便输入个密码回车,看看前后的 debug 输出些什么。