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

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

아래 시나리오를 고려하십시오.

2개의 VM - 192.168.229.131, 192.168.229.132

두 vms 모두 파일에 192.168.229.151 및 192.168.229.152의 IP가 있습니다 /etc/hosts.

위에서 말한 것처럼 약 50개의 VM이 있다고 가정해 보겠습니다. 하지만 지금은 위 2가지만 고려하고 있습니다.

2개의 VM의 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

이 경우 해당 행은 여전히 ​​localhost의 서버 파일에서 IP를 가져오는 반면, 원격으로 로그인한 서버의 errips 파일에서 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한 다음 if 루프를 실행하여 잘못된 IP를 올바른 IP로 바꾸려면 어떻게 해야 합니까?

답변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"

관련 정보