for 및 while 동작을 사용하여 파일 읽기

for 및 while 동작을 사용하여 파일 읽기

다음 시나리오를 고려하십시오.

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" 파일을 한 줄씩 읽고 /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"

관련 정보