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
.