이러한 직업,
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"'