내 명령은
X=`ssh ${OS_USER}@${OS_HOST} ". ~/.kshrc ;
ulimit -c unlimited ;
cd ${OS_PATH}/NEW_BL1_RC_RATE/bin/conf;
echo "export RC_DB_INSTANCE=$7" >> RC_CONV_SET_VARS"`
$7
큰따옴표로 표시해야 합니다. 어떻게 할 수 있나요?
답변1
여러 수준의 중첩된 큰따옴표가 있습니다. 이는 매우 까다롭고 보기 흉하며 읽고 수정하기가 매우 어렵습니다. 예를 들어`
ssh ${OS_USER}@${OS_HOST} \
". ~/.kshrc; ... ;
echo \"export RC_DB_INSTANCE=\\\"\\\$7\\\"\" >> RC_CONV_SET_VARS".
(참고: 내 시스템에서 여러 따옴표 echo
로 묶은 것을 테스트했는데 bash -c
작동했지만 에서 작동할지 100% 확신할 수 없습니다 ssh
. 여러 수준의 따옴표와 백슬래시는 PITA이므로 피해야 합니다.)
RC_CONV_SET_VARS가 리터럴 파일 이름이 아니라 변수 이름인 경우 훨씬 더 복잡해집니다....RC_CONV_SET_VARS가 시스템에 로컬인지 아니면 원격 시스템에 로컬인지에 따라 더 복잡해집니다.
간단한 일회용 스크립트를 작성하여 scp
원격 호스트에 작성한 다음 ssh
.
예를 들어:
다음을 다음과 같이 저장합니다 myscript.ksh
.
#! /usr/bin/ksh
. ~/.kshrc
ulimit -c unlimited
cd ${OS_PATH}/NEW_BL1_RC_RATE/bin/conf
echo 'export RC_DB_INSTANCE="$7"' >> "$RC_CONV_SET_VARS"
그런 다음 scp
원격 호스트로 이동하여 실행합니다.
scp myscript.ksh "${OS_USER}@${OS_HOST}:/tmp/"
ssh "${OS_USER}@${OS_HOST}" 'ksh /tmp/myscript.ksh'
아직 해결해야 할 인용 문제가 있지만 로컬 시스템에서 실행하려는 스크립트를 작성할 때 인용 문제와 거의 동일합니다. 추악하고 복잡하며 혼란스러운 여러 수준의 백슬래시 이스케이프 및 따옴표가 아닙니다.
비밀번호를 여러 번 입력해야 하기 때문에 이것이 실용적이지 않다면 그렇게 하지 마십시오. 키 기반 인증을 설정하고SSH에 비밀번호 기반 인증을 사용하지 마세요.
그런데 명령줄에서 필요한 모든 인수를 전달할 수 있습니다 ksh myscript.sh
.
ssh "${OS_USER}@${OS_HOST}" 'ksh /tmp/myscript.ksh arg1 arg2 arg3'
또는 7번째 인수를 통과해야 하는 경우현지의스크립트를 원격 스크립트로:
ssh "${OS_USER}@${OS_HOST}" "ksh /tmp/myscript.ksh \"$7\""
위 의 마지막 줄을 myscript.ksh
다음과 같이 변경합니다.
echo "export RC_DB_INSTANCE=\"$1\"" >> "$RC_CONV_SET_VARS"
답변2
따옴표를 "이스케이프"해야 합니다.
echo "export RC_DB_INSTANCE=\"$7\""
트릭을 할 것입니다 ...