SSH 연결 후 스크립트를 실행하는 방법

SSH 연결 후 스크립트를 실행하는 방법

여러 가지 정답과 오답을 들었지만 이것이 가능한지 아직 모르겠습니다. 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 -'

관련 정보