次のシナリオを考えてみましょう。
VM 2個 - 192.168.229.131、192.168.229.132
/etc/hosts
両方の仮想マシンファイルのIPは192.168.229.151と192.168.229.152です。
上記のように、約50台の仮想マシンがあるとします。しかし、これまでは上記の2つですが考慮しています。
2つの仮想マシンのIPをserverというファイルに保存しました。
#cat server
192.168.229.131
192.168.229.132
以下はスクリプトです
#!/bin/bash
cat server | while read line
do
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@$line << EOF
echo successfully logged in $line
MYIP=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p')
for i in 151 152
do
echo 192.168.229.\$i >> errips
done
for data in `cat errips`
do
echo data currently has $data
grep $data /etc/hosts
if [ $? -eq 0 ]
then
sed -i "s/$data/$MYIP/g" /etc/hosts
echo "completed"
unset MYIP
rm -rf errips
exit 0
fi
done
EOF
done
以下は出力です
root@master:~# ./script
cat: errips: No such file or directory
successfully logged in 192.168.229.131
cat: errips: No such file or directory
successfully logged in 192.168.229.132
ログインする前にサーバーにログインした後にforループが実行されるのはなぜですか?
"for"の代わりに次を試してみました。
cat errips |while read line
echo line currently has $line
この場合、リモートでログインしたサーバーのerripsファイルからIPを読み取る必要があり、その行がまだlocalhostのサーバーファイルからIPを取得していることがわかりました。
出力は次のとおりです
line currently has 192.168.229.131
line currently has 192.168.229.132
そして私の期待によると、「errips」ファイルの値を読み取る必要があり、出力は次のようになります。
line currently has 192.168.229.151
line currently has 192.168.229.151
今、私は次のコマンドを試しました。
cat errips |while read data
echo data currently has $data
この場合、値データの出力は空である。
data currently has
data currently has
リモートサーバーの "errips"ファイルを1行ずつ読み、/ etc / hostsの行をgrepしてから、無効なIPを正しいIPに置き換えるifループを実行するにはどうすればよいですか?
答え1
ここでは、ドキュメント制限文字列を一重引用符で囲む必要があります。それ以外の場合は、パラメータ置換が有効になります。これは働きます:
#!/bin/bash
cat server | while read line
do
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@$line <<'EOF'
echo successfully logged in $line
MYIP=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p')
for i in 151 152
do
echo 192.168.229.$i >> errips
done
for data in `cat errips`
do
echo data currently has $data
grep $data /etc/hosts
if [ $? -eq 0 ]
then
sed -i "s/$data/$MYIP/g" /etc/hosts
echo "completed"
unset MYIP
rm -rf errips
exit 0
fi
done
EOF
done
EOFの周りの一重引用符に注意してください。詳しくは、以下をお試しください。
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@<your_ip> 'k=1; echo $k'
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@<your_ip> "k=1; echo $k"
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@<your_ip> "k=1; echo \$k"