SSHで複雑なスクリプトを実行したい
#!/bin/sh
ARRAY1=(
server1s
server123
server12
server14
server13
)
for i in ${ARRAY1[@]};do ssh $i "
case \$HOSTNAME in
server1.domain.com)
echo try1
;;
server12.domain.com)
echo try12
;;
*)
echo try123
;;
esac
問題は、sshが私の内部ホスト名変数を読み取り、try123を返すことです。リモートサイトの内部変数を読むことは可能ですか? \ $ VARIABLEと$ VARIABLEを試しましたが、結果は同じです。
答え1
この場合、\$HOSTNAME
変数をエスケープする正しい方法は、次を使用することです。
ただし、この変数には通常、ホスト名(FQDNではない)を含めることも埋め込むこともできません。hostname -f
サーバーFQDNを取得するには、このコマンドを使用する必要があります。
最終的なスクリプトがどのように見えるかはわかりませんが、server1
そのサーバーを接続して確認することはserver1
(セキュリティの目的で)何とか役に立たない可能性があります。
script1.sh
次のスクリプトを作成できます。
echo "$HOSTNAME / $(hostname -f)"
それから
for i in ${ARRAY1[@]};do
case $i in
server1) ssh $i < script1.sh
;;
server2) ssh $i < script2.sh
;;
*) ssh $i < script_${i}.sh
esac
done
編集する:コメントで述べたように、OpenBSDディストリビューションはオプションをhostname
理解していません-f
。デフォルトの動作はFQDNを表示することです。