【问题标题】:Using expect to pass a password to ssh使用期望将密码传递给 ssh
【发布时间】:2010-10-02 07:57:16
【问题描述】:

如何使用 expect 向 ssh 连接发送密码。

说密码是 p@ssword 并且 ssh 命令是 ssh me@127.0.0.1

如果提示输入密码,我该怎么办?

me@127.0.0.1 的密码:
?

使用 SSH 密钥对的正确操作不是一个选项,因为我必须使用 ssh (scp) 将密钥放在服务器上,这会要求输入密码。

【问题讨论】:

  • 只需将密钥放在服务器上一次,然后它就不会再次提示输入密码。请参阅我的答案以获取操作指南的链接。
  • @malfist - 为什么这不是一个选项?通常假设任何解决方案的安装和配置,那么为什么不将其作为安装/配置的约束呢?除非你所做的事情不是光明正大的,否则你应该考虑以正确的方式去做,而不是设计一个hack-around。
  • 然后创建您自己的控制 tty 并从那里执行 ssh ......这对我来说仍然听起来很可疑,虽然。我想不出这种“自动化”的一个非非法用例。
  • 这样做的正当理由是,如果您正在编写对不支持基于证书登录的 网络设备 的 ssh 访问脚本 - 例如思科交换机。
  • 还有其他用例。我的是测试环境。每次重新安装代码时,证书都会更改。它是测试程序的一部分。并且测试必须是自动的...... :)

标签: ssh cygwin expect


【解决方案1】:

我总是使用“正确”的解决方案,但在其他情况下我使用了 expect。

Here我发现了以下建议:

#!/usr/local/bin/expect
spawn  sftp  -b cmdFile user@yourserver.com
expect "password:"
send "shhh!\n";
interact

【讨论】:

  • 谢谢!感谢您回答问题,而不是告诉我应该怎么做。
  • @Malfist:我不想这么说,但我处于“解释替代选项”的心态,而不仅仅是严格回答问题。我觉得你可以通过这种方式获得更多选择。
  • @R. Bemrose 喜欢尝试改变迷宫而不是帮助导航它。
  • 'expect 默认不安装。下载程序并将其安装在 unix 机器上'(来源 linux-bsd-central.com/index.php/content/view/26 )。可通过nist.gov/el/msid/expect.cfm下载下载
【解决方案2】:

使用公钥身份验证和使用没有密码的密钥不是更容易吗?

作为源计算机上的用户执行此操作以生成 RSA 密钥

ssh-keygen -t rsa

现在将 ~/.ssh/id_rsa.pub 复制到目标机器,并将其附加到目标用户的 authorized_keys 文件中

【讨论】:

    【解决方案3】:

    您最快的前进方式(除非您想成为 Tcl 专家,这在 2009 年将是……不寻常的……)可能是使用autoexpect。这是手册页:

    http://expect.nist.gov/example/autoexpect.man.html

    简而言之,启动autoexpect,运行你的 ssh 会话,完成你需要做的事情,停止自动预期,然后敲打你的键盘,直到它工作为止:) 我假设你不需要除了快速破解来整理你的钥匙然后,听起来你已经知道分数了。

    还有this question 已经包含了一个接近你所寻求的例子。

    【讨论】:

    • 嘿,不要因为你没有勇气去学习它就到处说 tcl 的坏话! ;)
    • cygwin 不提供 autoexpect。我希望是的。
    • link to autoexpect 在您的答案中的联机帮助页不再起作用。
    【解决方案4】:

    Cygwin 有 autoexpect 只是不在 bin 包中。运行 setup.exe 并搜索 expect 并选中源复选框。您将在 /usr/src 中看到生成的树,其中有一个 expect/expect/examples 目录。里面有一个 autoexpect 脚本的副本。

    【讨论】:

      【解决方案5】:

      密钥解决方案将不起作用...因为密钥必须只有运行 ssh 的人才能读取。在 xp 上,您无法创建具有正确权限的密钥结构。所以 ssh 不会读取它们。这可能已经改变,但最后我检查它仍然无法正常工作。

      【讨论】:

      • 欢迎来到 Stack Overflow。此评论不适合作为答案。一旦您获得更多声誉,您将被添加到问题和答案中。
      • @mikey-b 在 NTFS 文件系统上,您可以使用文件权限来保护文件免受未经授权的查看。
      【解决方案6】:

      我很确定不可能做你想做的事。大多数提示输入密码的 *nix 应用程序直接从 TTY 读取,而不是标准输入,因此您无法输入密码。正如其他人所提到的,您可以将 SSH 配置为不提示输入密码,如 here 所述.

      在我无缘无故被否决后,我对expect 命令进行了更多研究,发现它有一个send_tty 命令发送到/dev/tty 而不是stdin,这实际上可能做你想做的……我以前不知道这个功能。不过,我仍然建议将密钥放在服务器上。

      【讨论】:

      • 我知道这一点,这就是我使用 Expect 的原因,因为它可以像那样进行通信。
      猜你喜欢
      • 2017-06-20
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2015-11-19
      • 2013-03-19
      • 1970-01-01
      相关资源
      最近更新 更多