원격 서버에서 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