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

回答:


11

非インタラクティブSSHセッション

リモートサーバーでインタラクティブセッションを必要としない場合は、Automatorの[ シェルスクリプトの実行]アクションの一部など、がsshない環境で実行できます。tty

呼び出されたときにパスワードを標準出力に出力するプログラムを作成する必要があります。たとえば、次の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

がなくttySSH_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

lssshコマンドライン)は、sshがログインしたときに実行されるコマンドで、その出力はAutomatorに出力されます。もちろん、ファイルにリダイレクトして、起動したプログラムの出力をログに記録することもできます。


を使用したインタラクティブなSSHセッション sshpass

ダウンロードしてコンパイルし、インストールしたところsshpass、問題なく動作しました。これが私がしたことです:

  1. Apple開発者ツールを入手する
  2. ダウンロードして開く sshpass-1.05.tar.gz
  3. ディレクトリにシェルを開きます 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

これをシェル関数で囲み、たとえばssh-yourhostname、タイプするだけで接続でき、自動的にパスワードを取得して入力します。


こんにちは、私が解決策に導いたので、私はあなたの答えを支持しました。ただし、ここで説明した内容は正確に機能しませんでした(これはLionのバージョンのsshに固有である可能性があります)1)非インタラクティブセッションの場合、sshはパスワードを要求し、入力した後、を取得しましたSTDIN is not a terminal。2)とのインタラクティブセッションのsshpass場合、-pオプションは明らかに何もしません。しかしsshpassSSH_ASKPASS設定中に実行しても機能します!
Chaitanya Gupta、

@ChaitanyaGupta奇数です。Automator on Lion内から非対話的に機能しました。その2番目の問題に関しては、その時点でダーティーシェルセッションがあった可能性があります。あなたに+1し、ソリューションをサイトに追加してくれてありがとう。
ダニエルベック

私の悪い点(1に関して)-Automatorではなく、ターミナルで非インタラクティブセッションを実行しようとしていました。Automatorで試してみましたが、まだSTDIN is not a terminalエラーが発生します。ただし、今回はパスワードの入力を求められませんでした。私は信じていないSSH_ASKPASS私は、ファイルを作成した場合、以降のAutomatorで働いているSSH_ASKPASSリターン間違ったパスワードを、私が手にPermission denied, please try again.エラーが発生しました。
Chaitanya Gupta、

1
最後の例では、UnixのようなOSでは、コマンドライン引数と環境変数がシステム上の他のユーザーに表示される可能性があるため、機密性の高いマルチユーザー環境では安全ではありません。
ユルゲン・ストローベル

@DanielBeckこれを機能させる方法のアイデアmacOs >= 10.13
nbari

7

私は解決策を見つけました(これに必要な重要な情報を提供してくれたDaniel Beckに感謝します)。私はこれをOS X Lion 10.7.2でのみテストしたことに注意してください。これでうまくいかない場合は、ダニエルの解決策を試してください。

まず、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

-3

こんにちは。他に何かを探してこのトピックに出くわした人がいますが...ここで何か欠けているものがあるかどうかわかりません...しかし、あなたのアプローチは私には奇妙に思えます。なぜ公開鍵認証だけを使用しないのですか... rsa鍵を生成します$ ssh-keygen -t rsa -b 2048 -C 'email / id'

理想的には、ssh-copy-id user @ hostを1回使用し、パスワードで1回認証して、他のサーバーにキーをインストールするか、任意の種類のスクリプトまたは認証ツールを使用して、キーを〜/ .ssh / authorized_keysにデプロイします他のホスト(ログインするユーザー用)コマンドで手動で実行した場合は、それに応じて/ etc / ssh / sshd_configを編集し、自動化(chef、ansible)を実行して、目的の状態の完全なコンディガをプッシュする必要があります。

配布する必要があるキーはid_rsa.pubで、秘密キーを安全に保ちます

キーチェーンを使用して、ホスト上でホストを認証するために、マシン上で簡単な自動編集を行い、〜/ .ssh / configを追加して以下を追加します。

ホスト* UseKeychainはい

ssh設定ファイルのオプションに関する詳細情報を探してください。


1
質問の本文の最初の文を読んでください: '' 鍵ベースの認証をサポートしいない sshサーバーにログインする必要があります''
スコット

こんにちはスコット私もあなたが彼が毎回パスワードを入力したくない、つまりそれをしていると言っている部分を逃したと思います。
Ricardo Mendes

いいえ、見逃していません。なぜ私がそうしたと信じますか?
スコット

BCあなたはまだ話している
Ricardo Mendes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.