SSH를 통해 원격 서버에 접속하고 일련의 명령을 실행합니다.

SSH를 통해 원격 서버에 접속하고 일련의 명령을 실행합니다.

원격 서버에서 3개의 명령을 실행해야 합니다.

이 두 명령은 간단한 버전 확인이고 세 번째 명령은 기본적으로 데이터베이스 버전을 확인하는 짧은 프로그램입니다. 내용은 이렇습니다

#!/bin/sh

ssh -t user@server << EOF

#AIP_version
domaininfo -d $GLOBAL_DOMAIN -history | head -n -3 | tail -1 > /home/abc/aip_version.txt

## Fetching AIP Online Details ##

variable1=$(
echo "set feed off
set pages 0
select * from system_parameters where name like '%VERS%';
exit
"  | sqlplus /@aipprealias01
)
echo "$variable1" > aipo_version.txt

#Fetching RPAS-AIP Details

domaininfo -d $GLOBAL_DOMAIN -version | sed -n '4,7p' > /home/abc/rpas-aip_version.txt

EOF

이 스크립트를 실행하려고 하면 다음 오류가 발생합니다.

stdin이 터미널이 아니기 때문에 의사 터미널은 할당되지 않습니다.

-bash: 8행: SQL*Plus:: 명령을 찾을 수 없음

-bash: 10행: 예상치 못한 토큰 'c' 근처에 구문 오류가 있습니다.

-bash: 10행: `저작권 (c) 1982, 2014, Oracle. 판권 소유. '

이 오류를 해결하는 방법을 이해하는 데 도움이 필요하며 두 번째로 1대가 아닌 여러 서버에서 SSH를 위해 이 스크립트를 어떻게 실행할 수 있습니까? 감사해요!

답변1

EOF작은따옴표로 묶인 문자열 에서 구분 기호 태그를 변경합니다 'EOF'. 이렇게 하면 로컬 셸이 $( ... )명령과 $variable변수를 평가하지 못하게 됩니다.

예를 들어, EOF이것을 마크업 주위의 작은따옴표(표시된 대로)와 비교한 다음, 마크업 없이 비교합니다.

nl << 'EOF'
Numbered line
And another $(date)
EOF

작은따옴표로 출력

 1  Numbered line
 2  And another $(date)

따옴표 없이 출력

 1  Numbered line
 2  And another 29 Dec 2021 16:20:40

답변2

*를 쉘로 바꾸고 로컬에서 명령을 실행하십시오. 다음을 시도하십시오.

    cat <your_script_body.txt>|ssh user@server "$(cat)"

your_script_body.txt:

#AIP_version
domaininfo -d $GLOBAL_DOMAIN -history | head -n -3 | tail -1 > /home/abc/aip_version.txt

## Fetching AIP Online Details ##

variable1=$(
echo "set feed off
set pages 0
select * from system_parameters where name like '%VERS%';
exit
"  | sqlplus /@aipprealias01
)
echo "$variable1" > aipo_version.txt

#Fetching RPAS-AIP Details

domaininfo -d $GLOBAL_DOMAIN -version | sed -n '4,7p' > /home/abc/rpas-aip_version.txt

관련 정보