bashを使用してテストユーザーリストとホストリストを使用してSSH接続テストをスクリプト化しようとしています。助けてもらえますか?

bashを使用してテストユーザーリストとホストリストを使用してSSH接続テストをスクリプト化しようとしています。助けてもらえますか?

そのテストユーザーアカウントセットを使用して、ホストセットへのSSH接続をテストしようとしています。

testuser1 test ssh connection to server1つまり、、testuser2 test ssh connection to server2などtestuser3 test ssh connection to server3です。

各テストユーザーは秘密鍵を使用してログインします。 ssh -i ~/keys/testuser1key testuser1@server1

ところで、この情報を変数に入れる際に問題が発生しました。これは私が今まで持っているスクリプトです。

for host in $(cat hosts)
do
   if
      ssh -i $host 'true' exit
   then
      echo "SSH connection for $host ok"
   else
      echo "SSH connection for $host failed"
   fi
done
$SHELL

ファイルhostは次のとおりです。

~/keys/testuser1key testuser1@server1
~/keys/testuser2key testuser2@server2
~/keys/testuser3key testuser3@server3
...

次のエラーが発生します。could not resolve hostname true

ファイルの空白がhostスクリプトを破損していると思います。私は同様のスクリプトを使用しましたが、私のユーザーアカウントで "-i" sshフラグなしで実行することに問題はありませんでした。 ( ssh myuseraccount@testserver1)

より良いアプローチの助けや提案をいただきありがとうございます!

ベストアンサー1

while read暗黙の分割+グローブの動作に依存するのではなく、スペースで区切られたトークンを個々の変数に割り当てることができるようにループを使用することをお勧めします。$(cat hosts)

唯一のトリッキーな部分は、read基本的に標準入力でも読み取ることですssh。したがって、-nsshに/ dev / nullから読み取るように指示するフラグを渡す必要があります。

while read -r identityfile host; do
  if ssh -n -i "$identityfile" "$host" true
  then
    echo "SSH connection for $host ok"
  else
    echo "SSH connection for $host failed"
  fi
done < hosts

または、read別のファイル記述子から読み取るように指示します。

while read -u3 -r identityfile host; do
  if ssh -i "$identityfile" "$host" true
  then
    echo "SSH connection for $host ok"
  else
    echo "SSH connection for $host failed"
  fi
done 3< hosts

~注:$HOMEホストファイルのIDファイル部分にプレフィックスを付けるのではなく、使用すると作業が少し難しくなります。引用すると、"$identityfile"シェルはチルダの拡張を防ぎ、そのまま残します。連合国Quote(as)はトークン化とファイル名の生成を$identityfile可能にするので危険ですそれ〜らしい少なくとも、OpenSSH実装はそれ自体でssh拡張できますが、~ssh実装がそうでない場合は、それを正しく処理するために追加の処理が必要です。

1この場合、ファイル名の生成(ワイルドカード)が主な関心事です。名前にスペースが含まれていると、全体のアプローチに欠陥があるためです。

おすすめ記事