そのテストユーザーアカウントセットを使用して、ホストセットへの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
。したがって、-n
sshに/ 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この場合、ファイル名の生成(ワイルドカード)が主な関心事です。名前にスペースが含まれていると、全体のアプローチに欠陥があるためです。