SSH 연결을 통해 다음 명령을 실행하고 싶습니다.
tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}'
이 명령은 내 대상 컴퓨터에서 작동합니다.
이제 다른 컴퓨터에서 이 명령을 사용하고 ssh를 통해 실행하고 싶습니다. 그래서 제가 한 작업은 다음과 같습니다.
ssh jboss@myTargetServer tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}'
결과는
cat: /var/run/jboss-as/jboss-as-standalone8.pid: No such file or directory
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
내 전화에 무슨 문제가 있나요?
답변1
쉘이 질식할 수 있는 특수 문자를 줄이려면 명령을 단순화하는 것이 더 쉬울 수 있습니다.
ssh jboss@myTargetServer 'ps -p $(cat /var/run/jboss-as/jboss-as-standalone8.pid) -o %cpu= 2>/dev/null'
2>/dev/null
PID 파일을 찾을 수 없거나 오래된 PID가 포함된 경우 후행은 오류 텍스트를 버립니다.
답변2
. ssh
그렇지 않으면 명령줄의 전체 "원격" 부분을 따옴표로 묶고 내부의 모든 내용을 적절하게 이스케이프 처리해야 합니다. 이는 지루하고 오류가 발생하기 쉽습니다. 이것이 원격 스크립트 호출의 이유입니다.
답변3
두 번째 명령은 로컬 하위 쉘에서 코드 부분( )을 실행합니다 $()
. 특수 문자(기본적으로 $
) 를 이스케이프 처리하여 반대편에서 실행되도록 해야 합니다 .
ssh jboss@myTargetServer tmpValue=\$(cat /var/run/jboss-as/jboss-as-standalone8.pid) \
&& top -b -U jboss -n 1 |grep \$tmpValue |awk '{print $9}'
또는 모두 아포스트로피 안에 넣고 '
내부 항목을 피하십시오.
ssh jboss@myTargetServer 'tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) \
&& top -b -U jboss -n 1 |grep \$tmpValue |awk \'{print $9}\''
테스트하지는 않았지만 이를 수정하기 위해 수행해야 할 기본 아이디어입니다.
답변4
스크립트 작성을 정말로 꺼린다면 다음을 찾을 수 있습니다.
여기 문서능숙한. 짧게 말하면, << SOMETEXMARKER
줄 끝에 추가 하고 원하는 만큼 원격 호스트에 대한 명령을 계속 입력하면 됩니다. 그런 다음 마지막 줄에(줄의 맨 처음에) 동일한 내용을 입력하면 SOMETEXTMARKER
입력된 명령이 원격으로 실행됩니다.
샘플은 다음과 같습니다.
[bobby@bobby ~]$ ssh jimmy@jimmy << MRK '
> # single quote above makes all vars resolve on remote host
> echo remote user and host are :
> echo $USER $(hostname)
> # entereing closing single quote
> '
> # finally entereing the marker
> MRK
remote user and host are :
jimmy jimmy