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.

관련 정보