sshpassセッションからのリモートホスト名の出力

sshpassセッションからのリモートホスト名の出力

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

関連情報