SSH 연결을 통해 명령 실행

SSH 연결을 통해 명령 실행

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/nullPID 파일을 찾을 수 없거나 오래된 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

관련 정보