스크립트의 의사 터미널 메시지

스크립트의 의사 터미널 메시지

이건 내 스크립트야

#!/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'.

관련 정보