如何强制 ssh 客户端只使用密码认证?

Lan*_*nes 533 password ssh key-authentication

如果我使用来自例如 Ubuntu 11.04 的公钥身份验证,我如何将 ssh 客户端设置为仅对服务器使用密码身份验证?(只是因为在服务器上测试密码而需要,我默认使用密钥登录)

我找到了一个方法:

mv ~/.ssh/id_rsa ~/.ssh/id_rsa.backup
mv ~/.ssh/id_rsa.pub ~/.ssh/id_rsa.pub.backup
Run Code Online (Sandbox Code Playgroud)

现在我被提示输入密码,但有什么官方方法吗?

小智 822

我最近也需要这个,并想出了这个:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no example.com
Run Code Online (Sandbox Code Playgroud)

您需要确保客户端未配置为禁止密码身份验证。

  • 好的。在我的情况下,只有 `-o PubkeyAuthentication=no` 就足够了。 (39认同)
  • 这对我不起作用。它一直说:*权限被拒绝(公钥)。*并且从不提供密码提示。 (14认同)
  • 要通过 ssh 连接到朋友的 osx 笔记本电脑,我必须使用:`-o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no ` 代替 (13认同)
  • @reinierpost 这可能是因为 ssh *host* 已禁用“PasswordAuthentication”。事实上,我来这里是因为我想测试禁用密码身份验证在我的主机上是否正常工作。 (12认同)
  • 我需要强制密码提示出现在使用 Kerberos 进行自动身份验证的环境中,在这种特定情况下,类似的命令对我有用:`ssh -o GSSAPIAuthentication=no example.com` (6认同)
  • @reinierpost 我和你有同样的问题,用 `keyboard-interactive` 改变 `password` 使它工作,正如 guido 所发现的:`ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no me@example.com` (2认同)

Hal*_*gür 209

为此,我发现了一个快捷方式:

ssh user:@example.com
Run Code Online (Sandbox Code Playgroud)

注意冒号 ( :) 和它后面的空密码。

  • 这似乎不再起作用,至少在我的情况下。`ssh` 客户端盲目地尝试不相关的私钥来对新安装的服务器进行身份验证,并且由于在不要求密码的情况下达到了最大尝试次数而一直被拒绝。为了对第一次连接强制进行密码验证,我不得不使用 `-o PreferredAuthentications=password` 语法,冒号技巧没有明显效果。因此,虽然这个技巧可能值得一试,但不应依赖它作为一种一致的行为。 (65认同)
  • 还没有文档。实际上,我已经浏览了 OpenSSH 源代码,但无济于事(它的解析阶段相当神秘,现在是早上 :))。我最初的动机:如果您提供空密码,许多客户端会提示输入密码,例如`mysql -u user -p` (5认同)
  • @Qualcuno 正如 WhiteWinterWolf 所说,不幸的是,它不再适用于某些平台。 (3认同)
  • 这有记录在某处吗? (2认同)
  • 确保您的 ssh_config 文件中没有 PasswordAuthentication no! (2认同)

Eig*_*ony 46

除了 scoopr 发布的方法,您还可以在 ssh 客户端配置文件中设置每个主机选项。

在您的.ssh目录中,创建一个名为config(如果它不存在)的文件并将权限设置为600,然后您可以创建以开头的部分

host <some hostname or pattern>
Run Code Online (Sandbox Code Playgroud)

然后在此之后设置每个主机选项,例如,

host bob.specific.foo
user fred

host *.home.example
user billy
port 9191
Run Code Online (Sandbox Code Playgroud)

所以你可以有

host server.to.test
PubkeyAuthentication no
Run Code Online (Sandbox Code Playgroud)

在那个文件中,然后简单地

ssh server.to.test
Run Code Online (Sandbox Code Playgroud)

并且该选项将被选中。

  • 感谢您的回答。我在“~/.ssh/config”中创建了一个条目并添加了“PubkeyAuthentication no” (2认同)
  • 对我不起作用。 (2认同)

小智 16

我最近需要这个,但上面的选项都不起作用,ssh -v表明通过-o开关传递的命令行选项被我的~/.ssh/config文件中指定的值覆盖。

有效的是这样的:

ssh -F /dev/null <username>@<host>
Run Code Online (Sandbox Code Playgroud)

ssh手册页:

 -F configfile
     Specifies an alternative per-user configuration file.  If a
     configuration file is given on the command line, the system-wide
     configuration file (/etc/ssh/ssh_config) will be ignored. The default 
     for the per-user configuration file is ~/.ssh/config.
Run Code Online (Sandbox Code Playgroud)

归功于此答案:如何让 ssh 忽略 .ssh/config?

  • 这并不能回答问题。您始终可以将密钥存储在代理中,并且您的方法不会阻止客户端使用它们。 (2认同)
  • 此外,如果您在标准位置拥有密钥(如问题中所示),无论配置是否存在,它们都将被使用。我会使用第一个答案中提到的方法之一。 (2认同)

小智 9

上面的评论中提到了这一点,但我认为它应该成为自己的答案。

对于Permission denied (publickey)尽管有其他解决方案但仍收到错误的人来说,问题可能是服务器设置为不接受密码。要更改此设置,您需要进入服务器(许多服务允许您通过管理控制台上的虚拟控制台使用密码进行访问)并且:

  1. nano /etc/ssh/sshd_config

  2. 找到PasswordAuthentication no并将其更改为yes,然后取消注释。

  3. 运行sudo service sshd restart(或者sudo systemctl restart sshd如果使用 systemd 服务)

  4. 现在尝试使用上述方法之一从远程服务器登录,例如ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no example.com


mik*_*n32 6

我尝试了其中的一些答案,但ssh -v一直显示我的公钥被从我的主目录中拉出。但是,指定一个虚假的身份文件对我有用:

ssh -i /dev/null host
Run Code Online (Sandbox Code Playgroud)

我必须在APC永久(要解决的破SSH服务器做到这一点机架式PDU -住宿远离这些东西,如果你对安全性-所以我最终把选择到我的配置文件:

Host apc1 apc2
KexAlgorithms +diffie-hellman-group1-sha1
IdentityFile /dev/null
Run Code Online (Sandbox Code Playgroud)