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


9

我需要登录到不支持基于密钥的身份验证的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

Answers:


10

非交互式SSH会话

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

您需要创建一个程序,该程序在被调用时将密码输出到标准输出中,例如,您需要使用以下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命令行上)是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

您可以在此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-yourhostname连接,让它自动检索并输入密码。


嗨,我赞成您的回答,因为它使我找到了解决方案。但是,您在此处描述的内容并不完全有效(这可能特定于Lion的ssh版本)1)对于非交互式会话,ssh仍然要求我输入密码,输入后,我得到了STDIN is not a terminal。2)对于使用进行的互动会话sshpass,该-p选项显然没有任何作用。但是sshpassSSH_ASKPASS设置时运行确实可以!
Chaitanya Gupta'2

@ChaitanyaGupta奇怪。它在Lion上的Automator中为我非交互地工作。关于第二个问题,那时我可能有一个肮脏的shell会话,我不确定。+1,感谢您将解决方案添加到该网站。
丹尼尔·贝克

我的问题(关于1)-我试图在终端而不是Automator中运行非交互式会话。我现在在Automator中尝试过,但仍然STDIN is not a terminal出现错误。但是,这次没有提示我输入任何密码。我确实认为SSH_ASKPASSAutomator正在工作,因为如果我使文件SSH_ASKPASS返回错误的密码,则会收到Permission denied, please try again.错误消息。
Chaitanya Gupta'2

1
对于最后一个示例,请注意,在类似OS的Unix下,系统上的其他用户可以看到命令行参数和环境变量,因此在敏感的多用户环境中这是不安全的。
尔根·斯特罗贝尔

@DanielBeck任何想法如何使它在macOs >= 10.13
nbari

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

需要注意的几点:

  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


如何使其在macOS >= 10.13
nbari '18

-3

嗨,我碰到这个话题的人正在寻找其他东西,但是...不知道我是否在这里遗漏了什么...但是您的方法对我来说似乎很奇怪。为什么不只使用公共密钥身份验证...生成rsa密钥$ ssh-keygen -t rsa -b 2048 -C'email / id'

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

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

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

主持人* UseKeychain是

寻找有关ssh config文件选项的更多信息,希望其中的任何方便


1
阅读问题正文的第一句话:“我需要登录到不支持基于密钥的身份验证的ssh服务器''
斯科特

嗨,斯科特,我想您也错过了他说他不想每次都输入密码的部分,这意味着他正在这样做。
里卡多·门德斯

不,我没有错过。你为什么相信我做到了?
斯科特

不列颠哥伦比亚省,您仍在谈论
Ricardo Mendes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.