以明文密码作为参数的SSH登录?

mml*_*mla 112 linux security login ssh ubuntu

我需要登录到我在运行 Ubuntu 的远程主机上创建的用户。我无法使用ssh密钥,因为 ssh 登录将通过在我无法访问的服务器中运行的 bash 脚本进行(想想像 Bamboo 这样的持续集成服务器)。

我知道这不是一个理想的做法,但我想要么将远程主机设置为不要求输入密码,要么能够使用类似的方式登录ssh --passsword foobar user@host,就像 MySQL 允许您进行登录那样。

我没有找到这个man ssh,我对解决这个问题的任何替代方法持开放态度。

小智 184

在 Ubuntu 上,安装sshpass软件包,然后像这样使用它:

sshpass -p 'YourPassword' ssh user@host
Run Code Online (Sandbox Code Playgroud)

sshpass还支持从文件或环境变量传递键盘交互密码,这在任何与安全相关的情况下可能是更合适的选项。详情请参阅man sshpass

  • 我只赞成答案。不是“理性的为什么你不这样做”的答案。只是答案。因此,我赞成你:) (17认同)
  • 虽然不推荐并且不是一个好的做法,但这正是问题的答案。考虑使用如上所述的密钥。但如果存在重大技术问题,这就是解决方案 (4认同)

Cel*_*ada 20

如果你选择的是把密码到一个脚本或ssh命令行或纯文本文件,那么你MUCH最好使用一个ssh键来代替。无论哪种方式,任何有权访问ssh存储客户端脚本的帐户的人都可以使用它来进入服务器,但至少在ssh密钥的情况下,OpenSSH 正确支持它,您不会通过以下方式授予访问权限其他方式ssh,如果有必要,它更容易被撤销,等等......

您必须解释为什么要求不使用 ssh 密钥。

还考虑使用强制命令(command="...".ssh/authorized_keys文件中),以便客户端只能访问在服务器上运行他们需要的命令而不是完整的 shell。

  • 我同意flarn2006。你不能说“这个问题很愚蠢,所以这里是另一个问题的答案,因为我认为这是一个更好的问题,我知道答案”。 (10认同)
  • Stackexchanges 的答案应该回答问题而不是争论问题是正确的。我有一个有效的方案。我需要在 95 个不同的框中设置我的 `~/.ssh/authorized_keys`。我写了一个脚本来自动推送我的 authorized_keys 文件,但仍然提示输入密码。让脚本在开始时提示输入密码会更好。 (8认同)
  • 这是非常人为的。一个不太人为的场景是服务器的被误导的管理员禁用了 ssh 密钥登录(`/etc/ssh/sshd_config` 中的`PubkeyAuthentication no`)。无论哪种情况,更好的解决方案是修复阻止您进行 ssh 密钥登录的潜在问题。如果失败,[请咨询 Gilles 指出的问题](http://unix.stackexchange.com/questions/31071/shell-script-for-logging-into-a-ssh-server)。 (7认同)
  • 远程主机实际上是其他工程师使用的虚拟机,除了测试自动化代码的副本外,没有任何值得冒险的资源。为了便于讨论,假设我唯一的访问权限是添加脚本文件,而不是在`~/.ssh/` 中添加 ssh 密钥。 (6认同)
  • @MichaelM 您不必在`~/.ssh/` 中添加 ssh 密钥。在任何你想要的地方添加密钥并使用`ssh -i /path/to/id_rsa` (3认同)
  • 使用密钥对登录服务器比使用密码更容易 ** 编写脚本。如果这是您第一次设置用于 SSH 的密钥,您可能需要寻找一个好的操作方法。 (2认同)
  • > 您必须解释为什么要求不使用 ssh 密钥。对不起,我必须反对这个。如果您知道问题的答案,只需给出答案。 (2认同)

emo*_*ory 11

首先,像其他受访者一样,我建议只使用 ssh 密钥。但我会假设控制服务器的人根本不会允许您使用 ssh 密钥身份验证,而您必须使用密码身份验证。

您可以使用 ControlMaster 和 ControlPath。

让 A 成为您无法访问的服务器(想想像 Bamboo 这样的持续集成服务器),让 C 成为运行 Ubuntu 的远程主机。

现在让 B 成为您控制的某台计算机。如果您不能提供合适的 B 计算机,则此答案将不起作用。

  1. 创建密钥对并将公共部分添加到 B 的 authorized_keys 文件中。给 A 私钥。现在您无需密码即可从 A 登录 B。
  2. 在 B 上手动ssh -M -S /tmp/controlpath C并在提示下输入您的密码。在此之后,你应该能够从A登录到C,无密码ssh -S /tmp/controlpath C

在 A 上的脚本中,您可以编写ssh B ssh C dostuff.

每次重新启动 B 时,您都必须重新建立连接ssh -M -S /tmp/controlpath C