首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“权限被拒绝(键盘-交互)”失败

“权限被拒绝(键盘-交互)”失败
EN

Stack Overflow用户
提问于 2022-02-18 08:12:12
回答 1查看 1.3K关注 0票数 1

在SSH中,我可以使用公司VPN和代理连接两台不同的机器。

为此,我的~/.ssh/config有两个主机定义如下:

代码语言:javascript
复制
Host foobar
  User alice
  HostName XXX.XXX.XXX.XXX
  ProxyCommand nc -x proxy-socks.foobar.com:4242 %h %p

对于两台主机,ProxyCommand是相同的,只有HostNameUser不同。每个主机都有我的公钥,我只需输入ssh foobar就可以连接到每个主机,不需要密码。

现在,我试着用ansible在这些机器上行动。我有一个类似的inventory.cfg,列出了~/.ssh/config中定义的两台机器的名称

代码语言:javascript
复制
[vpn]
foobar
barfoo

我尝试了这个简单的命令:

代码语言:javascript
复制
ansible -i inventory.cfg vpn -m ping

这对其中一台机器有效,但对另一台不起作用。以下是经过编辑的输出:

代码语言:javascript
复制
foobar | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
barfoo | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Welcome on barfoo [...] Permission denied (keyboard-interactive).",
    "unreachable": true
}

由于我从输出中的主机获得了“欢迎”消息,这意味着我到达了主机(因此代理配置应该是正常的)。但我无法理解错误“权限被拒绝(键盘交互)”。我可以在没有密码的情况下通过SSH连接到这台机器(实际上,管理员甚至禁用了密码认证,我不得不通过电子邮件向他们发送我的公钥)。

我试图通过添加--private-key $HOME/.ssh/id_rsa来说明我的SSH键,但是错误消息完全相同。

出于好奇,我尝试使用Python的包fabric,但这对两台机器都很好:

代码语言:javascript
复制
import fabric
fabric.Connection('barfoo').run('hostname')

所以似乎在ansible和这个机器配置之间发生了一些奇怪的事情。有线索吗?

编辑

使用@GeralexGR的建议,我在ansible命令中添加了-vvvv以获得更多的输出。

在输出中,我可以看到ansible正在调用SSH:

代码语言:javascript
复制
ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o 'ControlPath="/home/alice/.ansible/cp/dbd7338475"' barfoo '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''

通过反复尝试,我可以将这个命令简化为以下命令:

代码语言:javascript
复制
ssh -vvv -o PreferredAuthentications=publickey barfoo 'hostname'

此命令在一台计算机上失败,但另一台计算机失败。但是,如果我删除了PreferredAuthentications选项,那么它在两台机器上都能正常工作。

当它失败时,它会输出类似这样的内容:

代码语言:javascript
复制
debug1: Next authentication method: publickey
debug1: Offering public key: [...]
[...]
debug1: Server accepts key: [...]
[...]
Authenticated with partial success.
debug1: Authentications that can continue: keyboard-interactive
debug3: start over, passed a different list keyboard-interactive
debug3: preferred publickey
debug1: No more authentication methods to try.

如果删除此选项并执行一个简单的ssh -vvvv,则在输出中得到如下结果:

代码语言:javascript
复制
debug1: Next authentication method: publickey
debug1: Offering public key: [...]
[...]
debug1: Server accepts key: [...]
[...]
Authenticated with partial success.
debug1: Authentications that can continue: keyboard-interactive
[...]
debug1: Next authentication method: keyboard-interactive
debug2: userauth_kbdint
[...]
debug1: Authentication succeeded (keyboard-interactive).

所以,我猜这台机器需要keyboard-interactive。实际上,如果我同时将publickeykeyboard-interactive放在选项中,这是可行的:

代码语言:javascript
复制
ssh -vvv -o preferredauthentications=publickey,keyboard-interactive barfoo 'hostname'

所以,回到ansible,我尝试了这个:

代码语言:javascript
复制
ansible -vvvv --ssh-extra-args='-o preferredauthentications=publickey,keyboard-interactive' -i inventory.cfg -m ping vpn

但是它还是失败了,我想这种认证机制是不可能的吗?我不知道为什么/如何在这里需要键盘交互,因为我从来没有提示输入密码。我会问机器的管理员。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-21 08:59:00

@Zeitounator在评论中给出了解决办法。

我在我的inventory.cfg文件中添加了这两行(带有虚拟密码):

代码语言:javascript
复制
[vpn:vars]
ansible_ssh_pass=foo

现在,初始的ansible命令运行良好。

或者,在命令行上使用--ask-pass选项也有效:

代码语言:javascript
复制
ansible --ask-pass -i inventory.cfg -m ping vpn

关于上下文,我向机器管理员询问了一些更多的信息。这台机器不要求我提供密码或任何东西,但它要求一些外部用户(不是我)接受一些条款和条件。这就是为什么需要keyboard-interactive机制的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71170226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档