이건 내 스크립트야
#!/bin/bash
exec < filelist.txt
while read updatedfile oldfile; do
# echo updatedfile = "$updatedfile" #use for troubleshooting
# echo oldfile = "$oldfile" #use for troubleshooting
if [[ ! $updatedfile =~ [^[:space:]] ]] ; then #empty line exception
continue # empty line exception
fi
if [[ ! $oldfile =~ [^[:space:]] ]] ; then #empty line exception
continue # empty line exception
fi
echo Comparing $updatedfile with $oldfile
if diff "$updatedfile" "$oldfile" >/dev/null ; then
echo The files compared are the same. No changes were made.
else
echo The files compared are different.
cp -f -v $oldfile /infanass/dev/admin/backup/`uname -n`_${oldfile##*/}_$(date +%F-%T)
cp -f -v $updatedfile $oldfile
fi
done
#go through rest of servers from list
while read server <&3; do #read server names into the while loop
serverName=$(uname -n)
if [[ ! $server =~ [^[:space:]] ]] ; then #empty line exception
continue
fi
echo server on list = "$server"
echo server signed on = "$serverName"
if [ $serverName == $server ] ; then #makes sure a server doesnt try to ssh to itself
continue
fi
echo "Connecting to - $server"
ssh "$server" #SSH login
exec < filelist.txt
while read updatedfile oldfile; do
# echo updatedfile = $updatedfile #use for troubleshooting
# echo oldfile = $oldfile #use for troubleshooting
if [[ ! $updatedfile =~ [^[:space:]] ]] ; then #empty line exception
continue # empty line exception
fi
if [[ ! $oldfile =~ [^[:space:]] ]] ; then #empty line exception
continue # empty line exception
fi
echo Comparing $updatedfile with $oldfile
if diff "$updatedfile" "$oldfile" >/dev/null ; then
echo The files compared are the same. No changes were made.
else
echo The files compared are different.
cp -f -v $oldfile /infanass/dev/admin/backup/`uname -n`_${oldfile##*/}_$(date +%F-%T)
cp -f -v $updatedfile $oldfile
fi
done
done 3</infanass/dev/admin/servers.txt
SSH를 통해 서버 목록에 연결하려고 하면 오류가 발생합니다.
Pseudo-terminal will not be allocated because stdin is not a terminal.
그런 다음 내 스크립트는 ssh를 올바르게 실패하고 새 로그인 서버의 파일을 비교합니다. 왜 이런지 아는 사람 있나요?
답변1
ssh "$server"
get 이후의 모든 명령이 ssh 내에서 실행될 것으로 예상하시나요 ? 그런 일은 일어나지 않았습니다. 다른 매개변수 없이 호스트 이름과 함께 ssh를 사용하여 대화형 세션을 시작합니다. 종료 후 스크립트는 다음 명령( exec < filelist.txt
)을 계속 실행합니다. 이것은 ssh 내의 원격 명령이 아닙니다. 명령이 도착할 때 ssh는 완료되고 사라졌습니다. 이는 포함된 스크립트의 일반적인 순차적 실행입니다.
stdin이 리디렉션된 대화형 SSH 세션은 다소 특이합니다. 그것이 당신이 경고를 받은 이유입니다. (경고를 억제하려면 -t
또는 를 사용할 수 있습니다 -T
)
SSH 연결을 통해 대규모 스크립트를 전달하고 원격으로 실행하려면 다음을 사용할 수 있습니다.여기 문서, 이와 같이:
ssh "$server" sh <<EOF
your big script here...
EOF
로컬 스크립트에 의해 확장되어야 하는 변수와 원격 스크립트 실행 중에 확장되어야 하는 변수를 신중하게 고려하십시오. $
Heredoc의 보호되지 않은 콘텐츠는 기본적으로 확장됩니다. 원격 쉘이 를 볼 수 있도록 보호하려면 를 $
사용하십시오 \$
. 이 모든 것을 보호하려면 <<EOF
로 변경할 수 있습니다 <<'EOF'
.