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

Del*_*ted 22 linux ssh

服务器允许 SSH 连接,但不允许使用公钥身份验证。目前我没有能力改变这一点(由于技术困难,而不是组织方面的问题),但我会尽快完成!

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

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

sol*_*ald 25

有一个名为sshpass. 它允许您完全按照自己的意愿行事,并将服务器密码作为命令行参数或从文件中获取(我更喜欢这种方式,所以我的服务器密码没有显示在 shell 历史记录中)并且您使用它像这样:

sshpass -f file_with_password ssh user@server ls -la

这将通过 ssh 连接到服务器并运行ls -la. 但是,有一件事,您必须先手动 ssh 进入服务器(如果您还没有这样做),这样服务器就会被添加到您的~/.ssh/known_hosts. 如果你不这样做,sshpass将无法工作。

  • 这不是 OpenSSH 的标准部分,实际上我的机器(Mac OS X 10.7、Ubuntu 12.04、FreeBSD 8、Debian 3.1)都没有它...... (2认同)

Mox*_*Mox 8

您可以使用Expect来执行此操作。显然,从安全的角度来看,这不是可取的,因为它要求您使用包含明文密码的脚本。(但我不会强调这一点,因为你在你的问题中说你打算尽快使用公钥认证!)


peh*_*hrs 7

取决于您使用的脚本语言。我现在用 python 编写几乎所有的东西,这不是问题。pyssh 和 Paramiko 都可以让您轻松编写密码脚本。

如果您打算使用 (ba)sh 脚本来完成它并使用 OpenSSH,它会变得更难。OpenSSH 明确阻止您将密码放在命令行上(因为所有用户都可以使用类似 的东西查看命令行ps -fe,这很糟糕)。在这种情况下,您将不得不直接与 ssh 程序交互并有两个选项:

  • 您可以使用像 Expect 之类的东西编写大量支持代码。
  • 您使用 SSH_ASKPASS 变量进行黑客攻击,告诉它调用返回密码的应用程序并将其作为批处理作业运行,以防止它从终端读取。