여러 가지 정답과 오답을 들었지만 이것이 가능한지 아직 모르겠습니다. SSH를 통해 서버에 연결하고 스크립트를 실행하고 싶습니다.
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 doesn't try to ssh to itself
continue
fi
echo "Connecting to - $server"
ssh "$server" #SSH login
echo Connected to "$serverName"
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로 연결한 후 코드 블록을 실행하고 싶습니다.
답변1
현재 겪고 있는 문제는 SSH 연결이 스크립트를 "일시 중지"하고 echo Connected to "$serverName"
스크립트는 SSH 세션이 종료된 후에만 해당 줄을 다시 시작한다는 것입니다.
두 가지 옵션이 있는 것 같습니다. (아마도 더 있을 것 같지만 현재 생각나는 것은 이 두 가지입니다.)
옵션 1은 expect
스크립트 가능한 SSH 세션을 시작하여 기본 스크립트에서 SSH 세션으로 명령을 효과적으로 전송하는 것입니다. 옵션 2는 원격으로 실행하려는 블록을 원격 서버의 다른 스크립트로 배치하고 SSH를 통해 비대화식으로 실행하는 것입니다 ssh $server $script-to-run
.
답변2
이것을 단일 스크립트로 빌드하고 싶다면 다음을 사용할 수 있습니다.heredoc원격 SSH 서버에 대한 연결을 열 때.
예를 들어:
$ ssh user@server << EOT
...
commands
...
EOT
답변3
또는 간단히 파이프에 에코하고 표준 입력에서 모든 것을 실행하십시오.
echo " \
uname -a; \
whoami; \
uname " \
| ssh -l root localhost 'cat | sh -'