Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
fengmikaelson opened this issue Apr 7, 2024 · 55 comments
Closed

Comments

@fengmikaelson
Copy link

fengmikaelson commented Apr 7, 2024

请教一下~

用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 [email protected]
xxx
Please Enter MFA Code.
([email protected]) [OTP Code]: ^C
➜ ~ tssh -p2222 -i .ssh/id_rsa.pub [email protected] --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: [[email protected] aes128-ctr aes192-ctr aes256-ctr [email protected] [email protected] aes128-cbc aes192-cbc aes256-cbc]
debug: client supported ciphers: [[email protected] aes128-ctr aes192-ctr aes256-ctr [email protected] [email protected] 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]
[email protected]'s password:

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

@lonnywong
Copy link
Member

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

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

@fengmikaelson
Copy link
Author

#!!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
[email protected]'s password:

@lonnywong
Copy link
Member

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

@fengmikaelson
Copy link
Author

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

➜ ~ tssh -V
trzsz ssh 0.1.19

我是mac,通过brew安装的。

@lonnywong
Copy link
Member

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

    PasswordAuthentication no

@fengmikaelson
Copy link
Author

fengmikaelson commented Apr 7, 2024

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 [email protected]
[email protected]'s password:

@lonnywong
Copy link
Member

tssh -p2222 -i /Users/xxx/ZX/Jumpserver/id_rsa -o PasswordAuthentication=no [email protected]

这样登录试试。

@lonnywong
Copy link
Member

另外,你在命令行中用的是 [email protected],那在配置中的 Host 就应该是 Host [email protected]

你现在的配置是 Host Jumpserver,那在命令行中就应该用 tssh Jumpserver,而不是 tssh [email protected]

@fengmikaelson
Copy link
Author

PasswordAuthentication=no

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

是不是ssh-rsa不支持?

另外,你在命令行中用的是 [email protected],那在配置中的 Host 就应该是 Host [email protected]

你现在的配置是 Host Jumpserver,那在命令行中就应该用 tssh Jumpserver,而不是 tssh [email protected]

我用过tssh Jumpserver也不行呢,所以我才换tssh -p [email protected]这些来测试,想看看输出内容

@lonnywong
Copy link
Member

tssh -p2222 -i /Users/xxx/ZX/Jumpserver/id_rsa -o KbdInteractiveAuthentication=yes [email protected]

试试这样

@fengmikaelson
Copy link
Author

KbdInteractiveAuthentication=yes

➜ ~ tssh -p2222 -i ~/.ssh/id_rsa -o KbdInteractiveAuthentication=yes [email protected]
[email protected]'s password:

还是提示我输密码。。。

@lonnywong
Copy link
Member

ssh -vvv 登录,发一下详细的 openssh 日志到我的邮箱 [email protected]

@fengmikaelson
Copy link
Author

ssh -vvv 登录,发一下详细的 openssh 日志到我的邮箱 [email protected]

已发送~麻烦你了。

@lonnywong
Copy link
Member

你试试 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
Copy link
Author

ssh -o PubkeyAuthentication=no

➜ ~ ssh -o PubkeyAuthentication=no -p2222

加上以后让我输密码了

@lonnywong
Copy link
Member

ssh -o PubkeyAuthentication=no

➜ ~ ssh -o PubkeyAuthentication=no -p2222

加上以后让我输密码了

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

@fengmikaelson
Copy link
Author

ssh -o PubkeyAuthentication=no

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

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

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

@lonnywong
Copy link
Member

在支持之前,你可以这样配置,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
Copy link
Author

#!! 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
[email protected]'s password:(这里会弹出输密码,但是可以回车直接跳过)
([email protected]) [OTP Code]:(到这里就让我输入otp里,好像没有自动带入成功。。。)

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

@lonnywong
Copy link
Member

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

@fengmikaelson
Copy link
Author

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
[email protected]'s password:
➜ ~

还是不太行,T-T

@lonnywong
Copy link
Member

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

@fengmikaelson
Copy link
Author

ssh -T Jumpserver echo ok

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

@lonnywong
Copy link
Member

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

@fengmikaelson
Copy link
Author

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

No PTY requested.

@lonnywong
Copy link
Member

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

@fengmikaelson
Copy link
Author

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

一样,是No PTY requested.

@lonnywong
Copy link
Member

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

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

@fengmikaelson
Copy link
Author

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

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

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

@fengmikaelson
Copy link
Author

fengmikaelson commented Apr 8, 2024

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

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

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

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

@lonnywong
Copy link
Member

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

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

@fengmikaelson
Copy link
Author

fengmikaelson commented Apr 8, 2024

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

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

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

估计是这里的问题吧
image

@lonnywong
Copy link
Member

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

@fengmikaelson
Copy link
Author

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

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

@lonnywong
Copy link
Member

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

@fengmikaelson
Copy link
Author

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

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

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

@lonnywong
Copy link
Member

你自己编译一个来试试( 更新 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
Copy link
Author

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
Copy link
Member

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

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

@fengmikaelson
Copy link
Author

IdentityFile /Users/xxx/.ssh/id_rsa

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

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

@lonnywong
Copy link
Member

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

你再加 PasswordAuthentication no 这行配置

@fengmikaelson
Copy link
Author

PasswordAuthentication no

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

@lonnywong
Copy link
Member

是用这个重新编译的?要执行 ./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
Copy link
Author

是用这个重新编译的?要执行 ./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
Copy link
Member

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

@fengmikaelson
Copy link
Author

golang.org/x/crypto

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

@lonnywong
Copy link
Member

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

@lonnywong
Copy link
Member

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

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

@fengmikaelson
Copy link
Author

不行~喊我输密码了,但是可以直接为空跳过,到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
Copy link
Member

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

@fengmikaelson
Copy link
Author

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

我发你邮箱了,不然要剔除好多私密信息= =

@lonnywong
Copy link
Member

Host Jumpserver
   #!! Password A # 这里随便配置个错误的密码
   #!! TotpSecret1 xxxxx # 这里配置 totp 的密钥

这样应该就能自动登录了。上面的 xxxxxoathtool --totp -b xxxxx 最后的 xxxxx 应该是一样的就行。

@fengmikaelson
Copy link
Author

Host Jumpserver
   #!! Password A # 这里随便配置个错误的密码
   #!! TotpSecret1 xxxxx # 这里配置 totp 的密钥

这样应该就能自动登录了。上面的 xxxxxoathtool --totp -b xxxxx 最后的 xxxxx 应该是一样的就行。

Host Jumpserver
HostName xxx.com
Port 2222
User xxxx
IdentityFile ~/.ssh/id_rsa
#!! Password A
#!! TotpSecret1 LxxxYIT

目前用这个配置,可以了。
tssh和./bin/tssh都可以。
感谢!

@lonnywong
Copy link
Member

#!! TotpSecret1 LxxxYIT 这个不是真的密钥吧?

@fengmikaelson
Copy link
Author

#!! TotpSecret1 LxxxYIT 这个不是真的密钥吧?

不是,哈哈,随便xxx了几个

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants