![로컬로 실행되는 스크립트 내에서 SSH를 통해 HEREDOC을 원격 호스트로 보낼 수 있습니까?](https://linux55.com/image/61774/%EB%A1%9C%EC%BB%AC%EB%A1%9C%20%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EB%82%B4%EC%97%90%EC%84%9C%20SSH%EB%A5%BC%20%ED%86%B5%ED%95%B4%20HEREDOC%EC%9D%84%20%EC%9B%90%EA%B2%A9%20%ED%98%B8%EC%8A%A4%ED%8A%B8%EB%A1%9C%20%EB%B3%B4%EB%82%BC%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
나는 본질적으로 머신 A에서 SSH를 통해 머신 B에 명령을 실행하고 출력을 머신 A로 반환하는 스크립트를 실행하고 싶습니다.
따라서 가능하다면 이를 수행하기 위한 csh 스크립트를 만들고 싶습니다.
예를 들어 이 솔루션은 다음에서 제공됩니다.이 답변명령줄에서 작업:
ssh user@host << 'ENDSSH'
ls -l
ENDSSH
로컬이 아닌 원격으로 ls가 실행되고 있는지 확인할 수 있습니다.
그러나 로컬로 실행되는 csh 스크립트 내의 백틱 내에서 이 작업을 수행하고 싶습니다. 가능합니까?
SSH를 통해 로그인하고 원격 스크립트를 실행할 수 있다는 것을 알고 있지만 제 경우는 그렇지 않습니다.
또한 SSH를 통해 로컬에 저장된 두 번째 스크립트를 보낼 수 있다고 들었습니다(나도 알아내지 못했습니다). 그러나 모든 명령을 원본 스크립트에 포함하여 HEREDOC을 포함한다는 아이디어가 마음에 듭니다.
이것이 매우 구체적인 문제라는 것을 알고 있지만, 방법이 있다면 어떻게 해야 하는지 알면 정말 좋을 것 같습니다.
작동하지 않는 것들
1)
`ssh user@host<<'ENDSSH'`
`echo "ls -l"`
`echo "ENDSSH"`
오류가 발생합니다.
stty: standard input: Invalid argument.
stty: standard input: Invalid argument.
Warning: Command not found
그런 다음 ls -l
로컬로 실행되고 로컬로 실행을 시도하지만 ENDSSH
물론 실패하고 명령을 찾을 수 없습니다.
2)
`ssh user@host<<'ENDSSH'`
echo "ls -l"
echo "ENDSSH"
ls -l
및 텍스트 로만 표시된다는 점을 제외하면 위와 동일한 문제입니다 ENDSSH
. 말이 되는군요... HEREDOC이 부분적으로 실패했기 때문입니다.
삼)3-5는 내가 요구하는 것이 정확히 아니지만 여전히 기본 사례가 작동하도록 노력하고 있습니다.
`ssh user@host ls-l`
예 total: Command not found.
, 어디서 왔는지 모르겠습니다.
4)
`cat ./test.csh | ssh user@host`
또한 시도 #1과 동일한 결과를 반환합니다.
5)
`cat ./test.csh | ssh -t user@host`
#1과 4와 동일합니다.
다른 솔루션을 위해 stackoverflow/Ubuntu/serverfault...etc를 소모하기 시작했습니다. 대부분의 사람들은 로컬로 실행되는 스크립트에서 원격으로 명령을 실행하는 방법보다는 명령줄에서 원격으로 스크립트를 실행하는 방법을 묻습니다.
편집하다
글쎄, 나는 문제의 일부를 해결했다고 생각합니다. 위의 사례 3을 예로 들면 ls -l
로컬에서 실행된 다음 출력의 첫 번째 부분이 SSH를 통해 명령으로 전송됩니다.
로 설정하려고 했기 때문에 이 사실을 알았습니다 ssh user@host $CMD
. 그런 다음 출력이 ls 출력에서 나오고 있음을 깨달았습니다. 하지만 아직도 이 문제를 어떻게 해결해야 할지 확신이 서지 않습니다.$CMD
"whoami"
username: Command not found
total
답변1
실행하려는 전체 명령을 백틱 내에서 래핑하면 올바른 솔루션을 얻을 가능성이 높습니다. 변수 및 기타 보간된 요소의 평가와 관련하여 몇 가지 문제가 있지만 지금은 이러한 문제를 제쳐두겠습니다.
그러나 백틱으로 된 항목을 원하는 이유가 무엇인지 잘 모르겠습니다. 귀하의 질문에 원격으로 로컬 스크립트를 실행하고 싶다고 나와 있습니다. 첫 번째 예가 바로 그 일입니다.
ssh -q user@host << ENDSSH
hostname
ls -l
id
ENDSSH
원격 실행의 출력을 변수에 넣고 싶습니까? 질문 어디에도 그런 말은 없지만 당신은 그렇게 할 것입니다 ( bash
)
result=$(ssh user@host <<'ENDSSH'
hostname
id
ENDSSH
)
...
echo "$result"
아니면, 말씀하셨으니까 csh
이렇게요.
set result = `ssh -q user@host` <<ENDSSH
hostname
id
ENDSSH
...
echo "$result"
변형 의 경우 csh
모든 출력 라인이 함께 연결됩니다.
버그를 보고하신 것으로 확인됩니다. 원격 서버의 로그인 스크립트에 명령이 있기 stty: standard input: Invalid argument.
때문일 수 있습니다 . stty
이는 대화형 셸 테스트에 포함되어야 합니다. 당신은 다음과 같은 일을 할 것 입니다 bash
:
if test -n "$PS1"
then
# Interactive setup here
stty ...
fi
답변2
당신이 무엇을 하고 싶은지 잘 모르겠지만 이것은 나에게 효과적이었습니다.
R=`ssh -t hostname <<EOF
ls -l
EOF`
stdio가 리디렉션되더라도 EOF가 끝날 때까지 백틱을 끄지 않고 -t 옵션을 사용하여 가상 TTY를 만듭니다.