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

Cha*_*pta 10 ssh macos

我需要登录到不支持基于密钥的身份验证的 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).
Run Code Online (Sandbox Code Playgroud)

无论如何我可以登录到这个服务器而不必每次都输入密码?

笔记

  1. 我在钥匙串中使用的方案看起来像这样
    • 种类:网络密码
    • 账号:用户名
    • 其中: ssh://server-name

Dan*_*eck 11

非交互式 SSH 会话

如果您不需要在远程服务器上进行交互式会话,您可以ssh在没有 的环境中执行tty,例如作为Automator 中运行 Shell 脚本操作的一部分。

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

#!/usr/bin/env bash
echo "password"
Run Code Online (Sandbox Code Playgroud)

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

export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls
Run Code Online (Sandbox Code Playgroud)

当没有tty, butSSH_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
Run Code Online (Sandbox Code Playgroud)

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


交互式 SSH 会话使用 sshpass

我下载、编译和安装sshpass,它运行得很好。这是我所做的:

  1. 获取 Apple 开发人员工具
  2. 下载并打开 sshpass-1.05.tar.gz
  3. 打开一个shell到目录 sshpass-1.05
  4. ./configure
  5. make
  6. 运行make install(你可能需要sudo它)

现在该程序已安装到/usr/local/bin/sshpass. 使用如下一行执行:

sshpass -pYourPassword ssh username@hostname
Run Code Online (Sandbox Code Playgroud)

您可以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
Run Code Online (Sandbox Code Playgroud)

将它包装在一个shell 函数中,您只需键入例如ssh-yourhostname连接,让它自动检索并输入密码。


Cha*_*pta 7

我找到了一个解决方案(感谢 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
Run Code Online (Sandbox Code Playgroud)

需要注意的几点:

  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"
Run Code Online (Sandbox Code Playgroud)

要在不输入任何密码的情况下登录 ssh 服务器,您只需要运行ssh-kcpass user@hostname.