뒤에 따옴표를 사용하여 여러 명령을 SSH로 연결

뒤에 따옴표를 사용하여 여러 명령을 SSH로 연결

변수 할당 기능이 있으므로 많은 따옴표가 필요한 여러 명령을 사용하여 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). 왜 그런지 모르겠어.

관련 정보