sshpassを使用してサーバーリストに接続し、約30個のコマンドリストを実行するシェルスクリプトを作成しました。スクリプトから抜粋した内容は次のとおりです。
スクリプトは新しい構成ファイルをインポートしますが、構成ファイルの変数をサーバーのホスト名に置き換えようとします。
リモートサーバーのホスト名が取得できず、ローカルホスト名(この場合はMacBookPro!)のみが出力されます。
#!/bin/bash
while read PASSWORD SERVER
do
sshpass -p "$PASSWORD" ssh -t -p 1234 $SERVER << !
echo "Server: $SERVER"
wget -N https://example.com/file.conf 2>&1 | grep -i "failed\|error\|saved"
1を試してください:
replace "variabletoreplace" "$HOSTNAME" -- file.conf
2回試してください:
sed -i "s/variabletoreplace/$(<file.conf)/" /proc/sys/kernel/hostname
スクリプトの終わり:
!
done <./server_list.txt
また、host = $(hostname -f)や$ HOSTなどの変数を割り当てようとしましたが、リモートホストは表示されません。
通常のsshコマンドで一重引用符の代わりに二重引用符を使用すると、この種の問題が発生する可能性がありますが、スクリプトをコマンドリストとして保持しながらスクリプトを変更する方法がわかりません。助けてくれてありがとう。
答え1
$
ローカルコンピュータの代わりにリモートコンピュータで拡張/実行されるように、変数(またはコマンド)の前にあるものをエスケープする必要があります。$HOSTNAME
$(hostname)
#!/bin/bash
while read PASSWORD SERVER;do
sshpass -p "$PASSWORD" ssh -t -p 1234 $SERVER << EOF
wget -N https://example.com/file.conf 2>&1 | grep -i "failed\|error\|saved"
sed -i "s/variabletoreplace/\$HOSTNAME/" file.conf
EOF
done
コメントで述べたように、sshキーを使用する方が良いですが、sshpass
実行したいすべてのコマンドがリモートホストのスクリプトにある場合ははるかに簡単になります。またはansible
、同じツールを使用する方が適切かもしれませんpuppet
。