SSH 대화형 및 명령 리디렉션 동작이 일관되지 않음

SSH 대화형 및 명령 리디렉션 동작이 일관되지 않음

이러한 직업,

ssh remote 'echo hi > hi.txt'
echo hi | ssh remote 'cat > hi.txt'

하지만 이건 작동하지 않아

ssh remote sh -c 'echo hi > hi.txt'

"hi"가 포함된 hi.txt라는 파일을 원격으로 생성하고 싶습니다. 대신 나는 얻는다비어 있는파일명은 hi.txt 입니다.

다음은 대화형 SSH 세션에서 실행할 때 예상되는 동작을 제공합니다.

sh -c 'echo hi > hi.txt'

SSH와 리디렉션에 대해 어떤 오해가 있습니까?

답변1

귀하의 로컬 쉘이 귀하의 따옴표를 제거하고 있다고 생각합니다. 당신은 시도 할 수 있습니다

ssh remote sh -c '"echo hi > hi.txt"'

ssh를 사용하여 원격 명령을 보낼 때 전송된 각 줄을 읽는 데 관련된 두 개의 셸이 있습니다. 로컬 쉘과 원격 쉘.

이에 대한 좋은 설명은 다음에서 찾을 수 있습니다.원격 셸에 대한 Unix/Linux 셸 참조

답변2

이것은 아마도 ssh를 사용할 때 가장 혼란스럽고 짜증나는 점일 것입니다(적어도 제 생각에는).

이 동작은 원격 명령을 실행할 때 ssh가 매개변수를 보존하지 않기 때문에 발생합니다. 모든 매개변수를 가져와 공백으로 구분하여 함께 연결합니다.

그래서 당신이 달릴 때

ssh remote sh -c 'echo hi > hi.txt'

실제로 실행 중인 내용은 다음과 같습니다.

ssh remote 'sh -c echo hi > hi.txt'

이것은 sh -c echo쉘(아니요echo) 인수 hi(사용되지 않음)를 입력하고 출력을 로 리디렉션합니다 hi.txt.

 

chhonous(중첩 참조)가 제공하는 솔루션은 이 문제를 해결하는 한 가지 방법입니다. 한 번 보자:

ssh remote sh -c '"echo hi > hi.txt"'

여기서 일어나는 일은 SSH 연결이 모든 매개변수를 사용하므로 실제로 다음과 같은 결과가 발생한다는 것입니다.

ssh remote 'sh -c "echo hi > hi.txt"'

관련 정보