2017-08-14 2 views
3

シェルスクリプトを書いています。ここでは、ssh設定ファイルからIdentityFileを入手する必要があります。 SSHの設定ファイルは次のようになります。シェルスクリプトを使って可変ホスト名に基づくssh設定からIdentityFileを手に入れてください

​Host AAAA 
    User aaaa 
    IdentityFile /home/aaaa/.ssh/aaaaFILE 
    IdentitiesOnly yes 
    PubkeyAuthentication=yes 
    PreferredAuthentications=publickey 
​Host BBBB 
    User bbbb 
    IdentityFile /home/aaaa/.ssh/bbbbFILE 
    IdentitiesOnly yes 
    PubkeyAuthentication=yes 
    PreferredAuthentications=publickey 
​Host CCCC 
    User cccc 
    IdentityFile /home/aaaa/.ssh/ccccFILE 
    IdentitiesOnly yes 
    PubkeyAuthentication=yes 
    PreferredAuthentications=publickey 

私は与えられたHostnameに基づいてIdentityFile次の文字列を取得し、変数に入れたいです。ホスト名は、${HOSTNAME}というシェル変数によって提供されます。

私は、単一の特定Hostnameに基づいて単一の特定IdentityFileのための設定ファイルとgrepを読むためにBash extract user for a particular host from ssh config fileで答えを使用することができましたが、私はawkのに変数を渡すのこつを取得することはできません。

これまでのところ、私は解析する正確なホスト名を与えているので、働く

SSH_CONFIG="/home/aaaa/.ssh/config" 
# Note AAAA is the hostname for this case 
KEY=$(awk '/^Host AAAA$/{x=1}x&&/IdentityFile/{print $2;exit}' ${SSH_CONFIG}) 
echo "${KEY}" 

OUTPUT: "/home/aaaa/.ssh/aaaaFILE" 

を試してみました。 しかし使用する

SSH_CONFIG="/home/aaaa/.ssh/config" 
HOSTNAME=AAAA 
KEY=$(awk -vcon="${HOSTNAME}" '/^Host con$/{x=1}x&&/IdentityFile/{print $2;exit}' ${SSH_CONFIG}) 
echo "${KEY}" 

OUTPUT: "" 

は動作しません。私は自分自身を設定しているので、${HOSTNAME}が設定されているという事実を知っています(それをエコーし​​ます)。変数を渡したいのですが、ホスト名をハードコードしたくないため、スクリプトが呼び出されるまでの値がわからないためです。

便利なssh -G HOSTNAMEオプションを持たないssh(OpenSSH_6.6.1)の古いバージョンを使用してもスタックされています。

awk変数については何がわかりませんか?これを行うより良い方法はありますか? GNUのgrepのとPerl互換正規表現で

答えて

2

hostname="AAAA" 
grep -Poz "Host $hostname(.*\n)*?.*IdentityFile \K.*" ~aaaa/.ssh/config 

出力:何らかの理由で

 
/home/aaaa/.ssh/aaaaFILE 
+0

この提案に感謝@Cyrus。これは私のために働いた。私はあなたの答えを選んでいます。なぜなら、 'grep'はより簡潔にするためです。 – Wimateeka

1

うーん、あなたは投稿の例では、ホスト単語の前に奇妙な非印字文字が含まれています。この正規表現は、最初の行:/^Host/と一致していましたが、3行に一致する必要があります。

これらの文字を削除してもう一度保存することで修正しました。

質問に答えて、awkの正規表現の中で変数を使うことはできません。

しかし、これも動作し、同じ操作を行います。

HOSTNAME="BBBB" 
awk -v host=$HOSTNAME '/Host/ && $2==host {found=1} /IdentityFile/ && found {print $2; exit}' ${SSH_CONFIG} 
+0

この提案に感謝@valrog。これは私のために働いた。 – Wimateeka

1

私は、スクリプトの試行を認めるが、OpenSSHクライアントがすでに設定解析する方法を知っている:それはまたすることを、

ssh -G $hosname | grep identityfile | awk '{print $2}' | head -n 1 

注意をデフォルトのアイデンティティを一覧表示しますが、IdentitiesOnly=yesを使用すると、最初のものとして設定のものをリストする必要があります。

+0

上記のように、便利なssh -G HOSTNAMEオプションを持たないssh(OpenSSH_6.6.1)の古いバージョンを使用していることもあります。あなたが私のためにDebianパッケージをロールしたくないのであれば、私はssh 'ssh -G'のスクリプトに執着しています。 – Wimateeka

+1

@Wimateeka申し訳ありませんが、私はその部分を逃しました。たぶん更新する時間? – Jakuje

+0

残念ながら私の決断はしていませんが、私を信じて、更新したいと思います。私はすでにsshpassのために冗長なオプションを持っていないという理由で、このためにもうんざりしています。 – Wimateeka

関連する問題