bash はスクリプト内の ssh 設定を忘れます

bash はスクリプト内の ssh 設定を忘れます

SSH キーのセットを作成し、既知のホストにアップロードするスクリプトを作成しています。これは、デバイスごとにキーが必要な場合に使用します。

新しいキーを作成した後、ホストにアップロードするオプションを追加しました。ただし、キー マネージャーにキーがロードされているためアイテムを送信するだけでよいのに、bash はパスワードの入力を求めます。または、フォールバックとして、ssh 構成で指定されたキーファイルのパスワードの入力を求めます。

スクリプトの関連部分は次のとおりです。

for host in "${hosts[@]}"
do
  keyfile=$(printf "%s_keys/%s_%s_%s.id_ed25519" "$system" "$system" "$email" "$host")
  ssh-keygen -t ed25519 -C $(printf "%s_%s" "$email" "$system") -P "$pw1" -f "$keyfile"
  read -r -p "ssh new key to host $host? [y/n] " response
  if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
  then
    cat $keyfile.pub | ssh "$host" 'cat >> .ssh/authorized_keys'
  fi
done

スクリプトを実行すると、次のようになりました:

The key fingerprint is:
SHA256:n8FWwe+TaHbWKwWVzCdIbAcfFnPTh8J0pukzuv9J4pQ a_b
The key's randomart image is:
+--[ED25519 256]--+
...
+----[SHA256]-----+
ssh new key to host [email protected]? [y/n] y
[email protected]'s password:
Permission denied, please try again.

しかし:

$ ssh myhost.com

You have new mail.
Last login: Sun Oct 30 03:28:07 2016 from 65.60.221.155
[myhost.com ~]

テストとして、このより簡略化されたスクリプトを書いてみましたが、問題なく実行されました。

$ cat test.bash
#!/bin/bash
echo test | ssh myhost.com 'cat >> test.txt'
$ ./test.bash

$ ssh myhost.com

You have new mail.
Last login: Sun Oct 30 03:33:25 2016 from 65.60.221.155
[myhost.com ~] cat test.txt
test

長いスクリプトで何をしたために SSH 情報が忘れられてしまったのでしょうか?

答え1

わかりました。この間違いを犯したことには少しバカみたいに感じますが、解決できたことには少し賢くなった気がします。@Jajuke の、非常に冗長な ssh を実行するという提案に感謝します。

私の ssh 設定では、ホストの略語を設定しています。たとえば、次のようになります。

Host myhost
  HostName myhost.com
  User username

そしてシェル上ではssh myhost​​、それを実行するだけですべてがうまく機能します。

ただし、私のスクリプトでは、完全なホスト名を持つ からホスト名を解析します.ssh/known_hosts:P 私の ssh 構成では、 に対して何も設定しておらずmyhost.com、 のみをmyhost設定していました。そのため、当然、 はパスワード認証にフォールバックしました。

私の解決策は、ssh 設定を更新して、エイリアスの横に完全なホスト名を含めることでした。

Host myhost myhost.com
  HostName myhost.com
  User username

そしてまた動作するようになりました!

うまくいけば、これによって誰かが同様の困惑から救われるでしょう。

関連情報