web-dev-qa-db-ja.com

sshが常にSSH_ASKPASSを使用するように強制する

SshがSSH_ASKPASSで指定されたプログラムを常に使用するように強制します。私の場合、プログラムはパスフレーズを返すbashスクリプトです。

問題は、sshのドキュメントにあるとおりです。

Sshがパスフレーズを必要とする場合、ターミナルから実行された場合、現在のターミナルからパスフレーズを読み取ります

したがって、ターミナルからsshを実行すると、SSH_ASKPASSは無視されます。

同様の質問があります: SSHにキーパスフレーズのグラフィカルプロンプトを使用するように伝えます

このようにsshのエイリアスを作成することを提案しています

$ alias ssh="setsid ssh"

sshを直接呼び出さないため、動作しません。gitまたはrsyncから呼び出されます。

OpenSSH Bugzillaで修正を求める open issue も見つけましたが、2002年にオープンされたため、実装されるとは思いません。

私はおそらく奇妙な解決策を考えています:

  1. スクリプトを呼び出してパスフレーズを返す偽のsshエージェントを作成します。
  2. 新しいsshプロセスを探すプロセスを作成し、sshがパスワードを要求する前にそれらをターミナルから切り離します。

より良いsugestion?

11
José Luis

sshマニュアルごと:

sshに端末が関連付けられていないが、DISPLAYとSSH_ASKPASSが設定されている場合、SSH_ASKPASSで指定されたプログラムが実行されます。

したがって、ターミナルの関連付けを解除し(パイプを追加するなど)、DISPLAYが設定されていないことを確認する必要があります(パスフレーズにターミナルを使用する場合)。

簡単な例:

echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...

ssh-addと同じ:

$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory
4
kenorb

残念ながら、リンクした未解決の問題にアクセスできませんが、 @ npostavs 'の提案(DISPLAYをいくつかの値に設定)を試してみましたが、機能しているようです1

例えば:

# List heads in a remote git repo
DISPLAY=: setsid git ls-remote -h [email protected]:NFL/tests.git

どこ

$ cat ${SSH_ASKPASS}
#!/bin/bash
echo ABCSuperPassword

この例では、SSH_AGENTはgitによって呼び出されます(set GIT_TRACE=2 verboser出力の場合)秘密キーのパスワードとして「ABCSuperPassword」を効果的に提供します。

ノート

1DISPLAYは、リモート端末にログインした場合、多くの場合設定されません。

1
Alberto