점프 서버에서 실행되는 bash 쉘 스크립트를 작성 중입니다. 검색할 문자열을 나타내는 하나의 매개변수가 있습니다. 인수는 디렉터리의 여러 파일에서 검색 인수를 찾아 결과를 따옴표로 묶은 문자 wc -l
로 변환하는 `-주변 명령(명령 대체)에 제공됩니다. 명령 인수로 전달된 문자열:
ssh server "[grep command]"
ssh 명령은 확인하려는 모든 서버를 통과하는 루프에서 실행됩니다.
각 요소가 적절한 시간까지 평가되지 않도록 모든 참조를 올바르게 만드는 것은 큰 고통이었지만 이 미친 일이 거의 작동하게 되었습니다.
모든 것이 올바른 서버에 SSH로 연결되지만 서버에서 명령이 실행되면 결과는 다음과 같습니다.
bash: /bin/echo "26520 instances of [xyz]": No such file or directory
26520은 성공적인 작업의 결과입니다.
/bin/grep xyz /path/to/logfiles/*access*|wc -l
이는 ssh를 통해 명령의 일부로 전달됩니다.
ssh server [command]
실제로 원격 서버 중 하나에 SSH로 연결하여 실행하면
$ /bin/echo "26490 instances of [xyz]"
26520 instances of [xyz]
물론 bash에는 문제가 없습니다.
실제로 원격 서버 중 하나에 SSH로 연결하여 실행하면
$ /bin/echo "`/bin/grep xyz /path/to/logfiles/*access*|wc -l` instances of [xyz]"
26520 instances of [xyz]
Bash에도 문제가 없습니다.
그러나 명령이 ssh를 통해 전달되면 이 문제가 발생합니다. grep 명령이 실행되어 올바른 결과를 생성하더라도
bash: /bin/echo "26520 instances of [xyz]": No such file or directory
Bash는 정확히 무엇에 반대합니까? 이 문제를 어떻게 해결할 수 있나요?
고쳐 쓰다: 단순화하기 위해 단일 명령줄로 문제를 재현할 수 있음을 발견했습니다.현지의서버, 스크립트, 변수 대체 등으로 인한 모든 복잡성을 추상화합니다.
$ ssh {remoteserver} "echo `/bin/grep xyz /path/to/logfiles/*access*|wc -l`"
grep: /path/to/logfiles/*access*: No such file or directory
26520
bash는 그러한 파일이 없다고 다시 불평한 다음(그래도 여전히 존재합니다) grep 명령을 실행하여 올바른 결과를 인쇄합니다.
명령줄 인수를 구문 분석한 후 파일 내용을 ssh로 파이핑한 후 원격 서버의 모든 명령을 로컬 서버의 파일에 작성하는 스크립트를 다시 작성하여 실제로 문제를 해결했습니다.
echo ... > commandfile
cat commandfile | ssh -T ${SERVER}
나도 해봤다 <
하지만 나는 여전히 bash 객체가 무엇인지 알고 싶습니다.
답변1
달리기
ssh {remoteserver} "echo `/bin/grep xyz /path/to/logfiles/*access*|wc -l`"
하위 명령이 원격 시스템이 아닌 로컬 시스템에서 실행되도록 합니다. 이는 다음을 사용하여 간단히 확인할 수 있습니다.
$ ssh host "echo `hostname`"
the local hostname
원격 서버에서 하위 명령을 실행하려면 아포스트로피를 사용하십시오.
$ ssh host 'echo `hostname`'
the remote hostname
그런데 업데이트 오류가 원래 오류와 다르네요...
답변2
ssh server "[grep command]"
변수 및 명령 대체( , , )는 큰따옴표 안에 수행되므로 에 또는 가 나타나면 호출 전에 로컬 쉘에서 수행됩니다. 그런 다음 교체가 수행되면(로컬에서 명령 실행) 원격 호스트에서 문자열을 호출합니다.$variable
$(command)
`command`
$
`
[grep command]
ssh
grep
ssh
echo
원격 호스트에서 실행할 명령을 작은따옴표(예: 아포스트로피)로 묶습니다.
ssh server '[grep command]'
단순화를 위해 명령에 작은따옴표를 포함하지 마십시오. 작은따옴표가 정말로 필요한 경우 '\''
(작은따옴표, 백슬래시, 작은따옴표, 작은따옴표)로 포함할 수 있습니다.