변수 할당 기능이 있으므로 많은 따옴표가 필요한 여러 명령을 사용하여 ssh 액세스에 사용해야 하는 서버가 있습니다. 스크립트를 고려하면 다음과 같습니다.
ssh user@host "kinit -k -t /path/to/dir/`whoami`.`hostname -s`.keytab `whoami`/`hostname -f`@host ;
set -x
touch health_check.log ;
echo \"Starting HDFS health check\" > health_check.log ;
echo \"/path/to\" >> health_check.log ;
hdfs dfs -du -h /path/to &>> health_check.log ;
echo \"**************************************************************************
/path/to/dir\" >> health_check.log ;
hdfs dfs -du -h /path/to/dir &>> health_check.log ;
subject=\"HDFS Health Check\" ;
from=\"[email protected]\" ;
recipients=\"[email protected]\" ;
mail=\"subject:$subject\nfrom:$from\nContent-Type: text/html\nMIME-Version: 1.0\n\n$(cat health_check.log)\" ;
echo -e $mail | sendmail \"$recipients\" ;
set +x
rm health_check.log
"
스크립트를 실행하면 다음과 같은 디버그 출력이 표시됩니다.
++ subject='HDFS Health Check'
++ [email protected]
++ [email protected]
++ mail='subject:\nfrom:\nContent-Type: text/html\nMIME-Version: 1.0\n\nStarting HDFS health check /data/gftocon'
++ echo -e
++ sendmail ''
내 변수가 있어야 하는 빈 문자열을 확인하세요. 이스케이프 따옴표가 작동하지 않는 이유는 무엇입니까?
답변1
이는 스크립트가 큰따옴표로 묶여 있기 때문입니다.너의 껍질변수 대체앞으로SSH 명령을 시작합니다. 백슬래시를 추가하거나 사용할 수 있습니다.여기에 인용됨이와 같이:
ssh user@host <<'END_COMMANDS'
# ...............^............^ these quotes make the whole document single-quoted
kinit -k -t /path/to/dir/`whoami`.`hostname -s`.keytab `whoami`/`hostname -f`@host
set -x
echo "Starting HDFS health check" > health_check.log
echo "/path/to" >> health_check.log
hdfs dfs -du -h /path/to &>> health_check.log
echo "**************************************************************************
/path/to/dir" >> health_check.log
hdfs dfs -du -h /path/to/dir &>> health_check.log
subject="HDFS Health Check"
from="[email protected]"
recipients="[email protected]"
headers="subject:$subject
from:$from
Content-Type: text/html
MIME-Version: 1.0"
{ echo "$headers"; echo; cat health_check.log; } | sendmail "$recipients"
set +x
rm health_check.log
END_COMMANDS
제 생각엔 이게 유지관리가 더 쉬운 것 같아요.
답변2
$
이런 캐릭터는 동네 에서 탈출 해야 할 것 같아요 "
"
.
메일 명령은 다음과 같습니다.
mail=\"subject:\$subject\nfrom:\$from\nContent-Type: text/html\nMIME-Version: 1.0\n\n\$(cat health_check.log)\"
참고: 그래도 가능할 것 같습니다 $(cat)
. 왜 그런지 모르겠어.