我需要登录到不支持基于密钥的身份验证的 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)
无论如何我可以登录到这个服务器而不必每次都输入密码?
笔记
Dan*_*eck 11
如果您不需要在远程服务器上进行交互式会话,您可以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_ASKPASS和DISPLAY(对于 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 中打印。当然,您可以将其重定向到一个文件以记录您启动的程序的输出。
sshpass我下载、编译和安装sshpass,它运行得很好。这是我所做的:
sshpass-1.05.tar.gzsshpass-1.05./configuremakemake 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连接,让它自动检索并输入密码。
我找到了一个解决方案(感谢 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)
需要注意的几点:
这假设您已按照我在问题中描述的方式将密码存储在钥匙串中
中给出的程序SSH_ASKPASS将在没有任何参数的情况下被调用;所以我们使用环境变量将用户和主机名传递给它。
现在我们可以设置SSH_PASSWORD_USER并SSH_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.
| 归档时间: |
|
| 查看次数: |
28145 次 |
| 最近记录: |