【问题标题】:Pass a password to ssh in pure bash在纯 bash 中将密码传递给 ssh
【发布时间】:2014-08-18 16:39:57
【问题描述】:

我想使用 bash 脚本将密码传递给 ssh(是的,我知道我可以使用 ssh 密钥,但这不是我想要的)。

我找到了一些使用 expect 的解决方案,但由于它不是标准的 bash 工具,我想知道我是否可以使用管道来做到这一点。

谁能给我解释一下,为什么是这样的:

echo "password\n" | ssh somehost.com

或

ssh somehost.com <(echo "password\n")

不工作?有没有可能让它发挥作用?也许将ssh作为不同的进程执行,获取它的PID,然后直接向它发送一个字符串?

【问题讨论】:

  • 你需要获得sshpass
  • 虽然这个问题听起来可能与 stackoverflow 的主题无关,但我没有发现它在其他任何地方被问到。问题和答案帮助我理解,为什么管道不适用于 ssh。 ("printf user/pass | vpn user@HOST" 有效。)
  • 非常密切相关:How to pass password to scp?

标签: linux bash pipe


【解决方案1】:

您不能从命令行指定密码,但您可以使用 ssh 密钥或使用 John C. 建议的 sshpass 或使用 expect 脚本。

要使用 sshpass,您需要先安装它。那么

sshpass -f <(printf '%s\n' your_password) ssh user@hostname

而不是使用sshpass -p your_password。正如 cmets 中的 Charles Duffy 所提到的,从文件或变量而不是命令行提供密码更安全。

顺便说一句,对&lt;(command) 语法的一点解释。 shell 执行括号内的命令,并用文件描述符替换整个内容,该文件描述符连接到命令的标准输出。你可以从这个答案中找到更多https://unix.stackexchange.com/questions/156084/why-does-process-substitution-result-in-a-file-called-dev-fd-63-which-is-a-pipe

【讨论】:

  • 这不是我的问题的确切答案,但谢谢,sshpass 对我来说是一个很好的解决方案。
  • 有人知道 sshpass 在系统上的位置吗?谁能告诉我它的路径?
  • 从安全的角度来看,密码应该永远在命令行上传递——命令行对整个系统都是可见的;即使是在启动后更改其命令行的命令也容易在此期间被捕获。如果您必须使用sshpass,还有其他更安全的使用模式。
  • 您可能会在答案中演示sshpass -f &lt;(printf '%s\n' your_password) ssh user@hostname,以便有一个更好的实践方法高度可见。 (因为printf 是一个内置的shell,它不会作为一个单独的命令执行,它的argv 通过procfs 暴露)。
  • $ brew search sshpass ... We won't add sshpass because it makes it too easy for novice SSH users to ruin SSH's security. 这很全面。不要使用非交互式密码。做 SSH 密钥。
【解决方案2】:

由于我的问题没有确切的答案,我做了一些调查,为什么我的代码在有其他可行的解决方案时不起作用,并决定发布我发现的内容以完成主题。
事实证明:

"ssh 使用直接 TTY 访问来确保密码确实是 由交互式键盘用户发出。”sshpass manpage

这回答了这个问题,为什么管道在这种情况下不起作用。显而易见的解决方案是创建条件,以便ssh“认为”它在常规终端中运行,并且由于它可以通过简单的posix 函数来完成,所以它超出了简单的bash 提供的范围。

【讨论】:

  • 既然您最终链接到 sshpass,我认为您应该将答案归功于其他人。
  • 我建议您先阅读问题是什么,而不是添加没有任何话题的 cmets。
  • 如果你的问题真的只是关于为什么 thing-X 不起作用,那么你的标题应该反映这一点,而不是关于如何完成 goal 那件事- X 将在其他情况下执行。现在,问题的主体集中在该领域,但标题完全是关于完成任务。
  • @CharlesDuffy “纯 bash”如何不反映使用标准 bash 调用的需要?为了得出这样的结论,你做了哪些心理锻炼?
  • @BłażejMichalik,...所以,我一直在说的是,标题应该反映了正文中给出的问题意图。我不反对 OP 不依赖 POSIX 未指定、内置于 bash 或作为 SSH 包的一部分提供的工具的意图。我确实反对他们的问题标题不符合该问题的意图。
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2021-11-17
  • 1970-01-01
  • 2012-10-21
相关资源
最近更新 更多