我可以使用 OS X 钥匙串中的密码自动登录 ssh 吗?

我可以使用 OS X 钥匙串中的密码自动登录 ssh 吗?

我需要登录不支持基于密钥的身份验证的 ssh 服务器。而且我不想每次都输入密码。

我正在使用 OS X Lion (10.7.2)。我已将密码添加到 OS X 钥匙串[1]。现在我可以使用 自动从钥匙串中检索密码/usr/bin/security,但我找不到将此密码发送到 ssh 提示符的方法。

我也试过sshpass。但是当我尝试运行它时,ssh 退出并出现以下错误:

ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (publickey,password).

有没有什么方法可以让我登录到该服务器而不必每次都输入密码?

笔记

  1. 我在钥匙串中使用的方案如下
    • 种类:互联网密码
    • 账户:用户名
    • 其中:ssh://server-name

答案1

非交互式 SSH 会话

如果您不需要在远程服务器上进行交互式会话,则可以ssh在没有的环境中执行tty,例如作为运行 Shell 脚本行动自动机

您需要创建一个程序,当调用时将密码打印到标准输出,例如您需要使用以下命令使以下 bash 脚本可执行chmod +x pwd.sh

#!/usr/bin/env bash
echo "password"

然后,将SSH_ASKPASS环境变量设置为该程序的路径,然后ssh在 Automator 操作中运行,如下所示:

export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls

如果没有设置tty,但设置了SSH_ASKPASSDISPLAY(对于 X11,默认设置),SSH 将执行指定的程序SSH_ASKPASS并将其输出用作密码。这旨在用于图形环境中,以便可以弹出一个窗口要求您输入密码。在这种情况下,我们只是跳过了窗口,从我们的程序返回密码。您可以security改为使用从钥匙串中读取,如下所示:

#!/usr/bin/env bash
security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2

ls(在命令行上)是登录后ssh执行的命令,其输出将打印在 Automator 中。当然,您可以将其重定向到文件以记录您启动的程序的输出。ssh


使用以下方式进行交互式 SSH 会话sshpass

我下载、编译并安装sshpass,它运行完美。以下是我所做的:

  1. 获取 Apple 开发者工具
  2. 下载并打开sshpass-1.05.tar.gz
  3. 打开目录的 shellsshpass-1.05
  4. 跑步./configure
  5. 跑步make
  6. 运行make install(你可能需要sudo它)

现在程序已安装到/usr/local/bin/sshpass。使用如下命令执行:

sshpass -pYourPassword ssh username@hostname

您可以在执行此操作之前读取密码security,然后像这样使用它:

SSHPASSWORD=$( security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2 )
sshpass -p"$SSHPASSWORD" ssh username@hostname

将其包装在 shell 函数中,您只需键入例如ssh-yourhostnameconnect 即可,让它自动检索并输入密码。

答案2

我找到了一个解决方案(感谢 Daniel Beck 提供所需的关键信息)。请注意,我只在 OS X Lion 10.7.2 上测试过。如果这对您不起作用,请尝试 Daniel 的解决方案。

首先,我们需要设置SSH_ASKPASS环境变量——它的值应该是将密码打印到标准输出的程序的路径。要从钥匙串中获取密码,它需要如下所示(我称之为get-ssh-password.sh):

#!/bin/bash

/usr/bin/security find-internet-password -a "$SSH_PASSWORD_USER" -s "$SSH_PASSWORD_HOSTNAME" -r "ssh " -g 2>&1 1>/dev/null | cut -d\" -f2

需要注意的几点:

  1. 这假设您已经按照我在问题中描述的方式将密码存储在钥匙串中

  2. 给出的程序SSH_ASKPASS将在没有任何参数的情况下被调用;所以我们使用环境变量将用户和主机名传递给它。

现在我们可以设置SSH_PASSWORD_USERSSH_PASSWORD_HOSTNAME运行sshpass来登录到我们的服务器。

我创建了另一个脚本ssh-kcpass来执行此操作:

#!/bin/bash

export SSH_ASKPASS=~/bin/get-ssh-password.sh
export SSH_PASSWORD_USER=$(echo "$1" | cut -d@ -f1)
export SSH_PASSWORD_HOSTNAME=$(echo "$1" | cut -d@ -f2)

sshpass ssh "$1"

要登录 ssh 服务器而不输入任何密码,您只需运行ssh-kcpass user@hostname

答案3

使用 Open ssh 1.8.4+,您可以将 SSH_ASKPASS 用作正常交互式用法(其中一些来自其他答案和评论):

$ brew install openssh # install 1.8.4+ if you don't have it, test current with ssh -V

/foo创建与此内容等效的文件

security find-generic-password -l your-password-item-label -w

并使其可执行,使用它

$ SSH_ASKPASS=/foo SSH_ASKPASS_REQUIRE=force ssh user@hostname

參考文獻:https://unix.stackexchange.com/a/603217/8337

如果您总是需要相同的密码,您可以将环境变量放在 ~/.zshrc 中。

答案4

大家好,我在寻找其他东西时偶然发现了这个主题,但是...不知道我是否遗漏了什么......但你的方法对我来说似乎很奇怪。为什么不直接使用公钥认证......生成一个 rsa 密钥 $ ssh-keygen -t rsa -b 2048 -C 'email/id'

理想情况下,您应该使用一次 ssh-copy-id user@host 并使用密码进行一次身份验证,以在另一台服务器上安装密钥,或者使用任何类型的脚本或身份验证工具将密钥部署到另一台主机上的 ~/.ssh/authorized_keys(对于您想要登录的用户)如果手动完成命令,则必须相应地编辑 /etc/ssh/sshd_config 并使用自动化(chef、ansible)推动完整的 condiga 达到所需状态。

需要分发的密钥是id_rsa.pub,请保证私钥安全

要使用钥匙串以自动直接的方式对主机进行身份验证,请在您的机器上编辑 ~/.ssh/config 并添加:

主持人 * UseKeychain 是

查找有关 ssh 配置文件选项的更多信息,希望这些对您有用

相关内容