당 zanco의 대답 , 당신은에 원격 명령을 제공하지 않는 ssh
쉘 명령 줄을 구문 분석하는 방법을 제공. 이 문제를 해결하려면 ssh
명령 호출 구문을 변경하여 원격 명령이 구문 상 올바른 다중 행 문자열로 구성되도록하십시오.
사용할 수있는 다양한 구문이 있습니다. 예를 들어, 명령을 bash
and sh
및 다른 쉘로 파이프 할 수 있으므로 가장 간단한 해결책은 ssh
쉘 호출을 heredocs와 결합 하는 것입니다.
ssh user@server /bin/bash <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
위의 내용 없이 실행 /bin/bash
하면 경고가 표시 Pseudo-terminal will not be allocated because stdin is not a terminal
됩니다. 또한 EOT
작은 따옴표 bash
로 묶여서 heredoc을 nowdoc 로 인식하여 로컬 변수 보간을 끄고 명령 텍스트가 그대로 전달되도록하십시오 ssh
.
파이프 팬이라면 다음과 같이 위의 내용을 다시 쓸 수 있습니다.
cat <<'EOT' | ssh user@server /bin/bash
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
위에도 동일한 경고가 /bin/bash
적용됩니다.
또 다른 유효한 방법은 bash
다음과 같이 여러 계층의 변수 보간을 사용하여 여러 줄 원격 명령을 단일 문자열로 전달하는 것입니다.
ssh user@server "$( cat <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
)"
위의 솔루션은 다음과 같은 방식으로이 문제를 해결합니다.
ssh user@server
bash에 의해 구문 분석되고으로 해석되어 ssh
명령, 인수 다음에 user@server
받는 전달되는 ssh
명령
"
완료 될 때 ssh
명령에 전달 될 인수를 구성하는 보간 된 문자열을 시작합니다 .이 경우이 ssh
명령은 다음과 같이 실행할 원격 명령 으로 해석 됩니다.user@server
$(
주변 보간 된 문자열에 의해 출력이 캡처되어 실행될 명령을 시작합니다.
cat
뒤에 오는 모든 파일의 내용을 출력하는 명령입니다. 의 출력은 cat
캡처 보간 문자열로 다시 전달됩니다.
<<
bash heredoc을 시작합니다
'EOT'
heredoc의 이름이 EOT임을 지정합니다. '
EOT를 둘러싼 작은 따옴표 는 heredoc이 nowdoc 로 구문 분석되어야 함을 지정합니다. nowdoc 는 내용이 bash에 의해 보간되지 않고 리터럴 형식으로 전달 되는 heredoc 의 특수 형식입니다.
사이에 <<'EOT'
있고 <newline>EOT<newline>
nowdoc 출력에 추가 될 모든 컨텐츠
EOT
nowdoc을 종료하여 nowdoc 임시 파일을 작성하여 호출 cat
명령으로 다시 전달 합니다. cat
nowdoc를 출력하고 출력을 캡처 된 보간 된 문자열로 다시 전달
)
실행할 명령을 종료합니다
"
보간 문자열 캡처를 마칩니다. 보간 된 문자열의 내용은 ssh
단일 명령 행 인수로 다시 전달되어 다음 과 같이 ssh
실행할 원격 명령으로 해석됩니다.user@server
과 같은 외부 도구를 사용 cat
하지 말고 하나 대신 두 개의 명령문을 사용하지 않아도 read
되는 경우 heredoc과 함께 내장을 사용하여 SSH 명령을 생성하십시오.
IFS='' read -r -d '' SSH_COMMAND <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
ssh user@server "${SSH_COMMAND}"
ssh user@server /bin/bash <<EOT…