通过SSH连接并自动输入密码,而无需使用公共密钥


20

服务器允许SSH连接,但不能使用公共密钥身份验证。目前(由于技术困难,而非组织上的原因)我无法更改此更改,但我会尽快解决!

现在需要的是使用脚本中的普通旧帐户+密码身份验证在服务器上执行命令。也就是说,我需要以非交互方式进行操作。可能吗?我该怎么办呢?

将要执行脚本的客户端运行Ubuntu Server 8.04。该服务器运行Cygwin和OpenSSH。


2
启用基于密钥的身份验证有哪些技术困难?也许您应该问这个问题,或者除了这个问题之外。
Zoredache

1
我在问。:-) serverfault.com/questions/125842 / ...我暂时只需要一条逃生路线,因为我已经将头撞了一段时间。但是,我的目标当然是使其长期运行。
删除了2010年

Answers:


22

有一个名为的Linux实用程序sshpass。它允许您完全按照自己的意愿进行操作,并且将服务器密码作为命令行参数或从文件中获取(我更喜欢这种方式,因此我的服务器密码不会显示在外壳程序历史记录中),并且您可以使用它像这样:

sshpass -f file_with_password ssh user@server ls -la

这将ssh放入服务器并运行ls -la。不过,有一件事,您必须先手动将ssh放入服务器(如果尚未这样做),以便将该服务器添加到~/.ssh/known_hosts。如果您不这样做,sshpass将无法正常工作。


2
这不是OpenSSH的标准部分,实际上我的所有机器(Mac OS X 10.7,Ubuntu 12.04,FreeBSD 8,Debian 3.1)都没有它……
voretaq7 2012年

@ voretaq7:sshpass是一个SourceForge项目:sourceforge.net/projects/sshpass
kevinarpe

1
@KCArpe我想您错了我的意思(“整个世界都不是您的 Linux机器-尝试选择在其他地方可以使用的解决方案”)。使用SSH_ASKPASS变量是更通用的解决方案,可在任何具有OpenSSH的系统上使用,并且不需要安装其他软件。对于我们中的某些人(在受管制的行业中),安装新软件会触发大量管理工作。
voretaq7 2013年

@ voretaq7使用SSH_ASKPASS不适用于所有系统。即使客户端支持它,如果服务器使用,它也将无法工作keyboard-interactive。在编写将authorized_keys文件分发到许多嵌入式计算机的脚本时,我实际上已经遇到了这个问题。
kasperd 2014年

8

您可以使用Expect执行此操作。显然,从安全角度来看,这不是可取的,因为这将要求您使用包含明文密码的脚本。(但是我不会为此感到遗憾,因为您在问题中说您计划尽快使用公共密钥身份验证!)


看来它将解决我的问题!我明天去看看。这不是最终的解决方案,但是它提供了一些安全性。考虑一下,如果脚本用户是唯一允许阅读脚本的用户。然后,它将和我的私钥一样安全,私钥也“仅”受文件系统权限保护。还是我错过了什么?
删除了2010年

我明天会得到结果。:-)谢谢您的回答!
删除了2010年

它似乎有效。但是对于这种特殊情况恕我直言,sshpass更容易。
删除了2010年

7

取决于您使用的脚本语言。我现在几乎用python编写了所有脚本,这是没有问题的。pyssh和Paramiko都允许您简单地编写密码脚本,而不必大惊小怪。

如果您打算使用(ba)sh脚本并使用OpenSSH进行操作,则会变得更加困难。OpenSSH明确禁止您在命令行上输入密码(因为所有用户都可以使用诸如之类的东西来查看命令行)ps -fe,这很不好。在这种情况下,您将必须直接与ssh程序进行交互并具有两个选项:

  • 您可以使用Expect之类的东西编写大量的支持代码。
  • 您使用SSH_ASKPASS变量进行黑客攻击,告诉它调用返回密码的应用程序,并将其全部作为批处理作业运行以防止其从终端读取。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.