SSH를 통해 명령을 실행할 때 while 루프에서 백틱 문제가 발생합니다.

SSH를 통해 명령을 실행할 때 while 루프에서 백틱 문제가 발생합니다.

이 질문은 조금 복잡합니다. 자세히 설명하려고 노력하겠습니다.

두 대의 컴퓨터가 있는데 하나는 로컬이고 다른 하나는 192.168.1.2로컬 컴퓨터에 다음 변수를 설정했습니다.

CHECK="/home/test/Desktop/"

test내 로컬 컴퓨터와 원격 컴퓨터 모두에 이름이 지정된 사용자가 존재합니다. SSH를 통해 로컬에서 다음 명령을 실행하고 싶습니다.

ssh -n [email protected] "until [ `cat $CHECK/samplefile | grep "string"` ]; do touch  $CHECK/success; done"

내가 달성하고 싶은 것은 원격 시스템의 $CHECK/samplefile에 "string"이라는 항목이 있는지 확인하고 싶다는 것입니다. 발견되면 until루프를 종료하고 계속 진행하고 싶습니다 . 하지만 이 명령을 실행하면 다음과 같은 오류 메시지가 나타납니다.

cat: /home/test/Desktop//samplefile: No such file or directory

test하지만 내 원격 컴퓨터 에는 사용자 데스크톱의 파일 이름이 샘플파일로 포함되어 있다고 확신합니다 . 추가 조사 후에 until백틱에 제공된 조건문이 실제로 local대신 실행된다는 사실을 발견했습니다 remote(내 로컬 데스크탑에는 그러한 파일이 없습니다). 또한, Until 루프의 나머지 명령은 제대로 작동하며, 원격 컴퓨터의 데스크톱에 Success라는 새 파일이 생성됩니다.

문제가 백틱에 있는지 또는 까지인지 확실하지 않습니다. 지난 3시간 동안 이 문제로 꼼짝 못했어요. 어떤 제안이 있으십니까?

답변1

귀하의 질문에서 알 수 있듯이 이 대체품은 다음과 같습니다.

`cat $CHECK/samplefile | grep "string"`

로컬 컴퓨터에서 실행됩니다. 다음 방법으로 쉽게 수정할 수 있습니다.

ssh -n [email protected] \
"until { cat ""$CHECK""/samplefile | grep ""string""; }; do \
touch  ""$CHECK""/success; \
done"

보시다시피 변수를 구문 분석하는 것 외에는 대체가 필요하지 않습니다 $CHECK. 조건부 명령어를 {...}목록 에 넣을 수 있으며 이제 목록의 종료 코드가 until명령어에 대해 결정됩니다.

답변2

당신 말이 맞아요. 그게 인용문이에요. 원격 명령을 큰따옴표로 묶으면 로컬 셸이 ssh 세션에 전달할 수 있는 모든 내용을 해석하도록 지시할 수 있습니다. 이 경우 cat명령.

명령을 작은따옴표로 묶으면 문제가 발생하지 않지만 작은따옴표 외부에 정의된 변수도 확장할 수 없습니다.

로컬 파일:

bash-[501]$ echo $(hostname) > /tmp/samplefile
bash-[506]$ echo $(cat /tmp/samplefile)
tank

원격 파일 생성:

bash-[502]$ ssh evil 'echo $(hostname) > /tmp/samplefile'
bash-[501]$ cat /tmp/samplefile
evil

큰따옴표를 사용하여 원격 파일을 확인해 보세요.

bash-[508]$ ssh evil "echo `cat /tmp/samplefile`"
tank

작은따옴표를 사용하여 원격 파일을 확인해 보세요.

bash-[509]$ ssh evil 'echo `cat /tmp/samplefile`'
evil

파일을 원격 측에서 처리할 변수로 정의합니다.

bash-[527]$ ssh evil 'F=/tmp/samplefile; cat $F'
evil

귀하의 경우 명령을 작은 따옴표로 묶고 $CHECK해당 따옴표 안에 정의하면 원격 측에서 해석할 모든 내용을 보내는 데 충분합니다.

ssh -n [email protected] 'CHECK=/home/test/Desktop; until [ `cat $CHECK/samplefile | grep "string"` ]; do touch  $CHECK/success; done'

답변3

export CHECK='/home/test/Desktop'
ssh -n [email protected] 'until [ `cat "$CHECK/samplefile" | grep "string"` ]; do touch  "$CHECK/success"; done'

관련 정보