"echo 명령 | ssh 서버"와 "ssh 서버 명령"을 혼동함

"echo 명령 | ssh 서버"와 "ssh 서버 명령"을 혼동함

비대화형 로그인 셸을 학습하는 과정에서 SSH를 통해 원격으로 명령을 실행하는 두 가지 방법을 발견했습니다. 나에게는 그것들이 모두 똑같아 보인다. 그러나 불행히도 그렇지 않습니다.

명령을 사용하면 echo "shopt login_shell; echo \$-" | ssh -l poweruser 192.168.1.67다음과 같은 결과가 출력됩니다.

Pseudo-terminal will not be allocated because stdin is not a terminal.
[email protected]'s password:
login_shell     on 
hBs

그러나 명령을 사용하면 ssh -l poweruser 192.168.1.67 "shopt login_shell; echo \$-"다른 결과가 나타납니다.

[email protected]'s password:
login_shell     off
hBc

두 번째 경우 비밀번호를 묻는 메시지가 표시되는데도 쉘이 로그인 쉘이 아닌 이유를 알려주실 수 있습니까?

답변1

man ssh문서에 따르면:

만약주문하다지정되면 로그인 쉘이 아닌 원격 호스트에서 실행됩니다.

그 이유는 어떤 경우에는 명령을 지정하고 다른 경우에는 지정하지 않으며 ssh의도적으로 (설계에 따라) 이러한 경우에는 다르게 동작하기 때문입니다.

명령을 제공하지 않으면 파이프된 입력을 읽고 실행하는 로그인 쉘이 시작됩니다. 명령을 제공한 곳에서는 시작되었습니다.

비밀번호를 묻는 메시지는 관련이 없습니다. 이는 쉘이나 명령을 실행하기 전에 서버에 사용자의 신원을 인증하기 위한 것입니다.

답변2

이는 부정확하지만 이를 살펴보는 데 유용한 방법이 될 수 있습니다.

  • echo … | ssh …대화형 세션과 "닮음" - ssh표준 입력에서 쉘 명령을 읽는 것으로 시작됩니다. 물론 지금은ssh 할 수 있는표준 입력이 파이프인지 tty(또는 파일)인지 구별하지만 아마도 그렇게 하지 않을 것입니다. tty와 다르게 파이프를 처리하면 다음과 같은 것을 사용하기가 더 어려워질 수 있습니다.expect(매뉴얼 페이지).

    echo … | ssh …누군가에게 전화해서 뭔가를 해달라고 요청하는 것 같은 느낌이 듭니다. 당신은 그들이 그렇게 하기를 원할 가능성이 있습니다. (아직 통화 중일 때) 로그인 쉘이 더 적절하다고 느껴집니다.

  • 를 사용하면 연결이 설정되기 전에 실행할 명령을 지정할 수 있습니다. 표시된 응답을 기반으로 조건부로 작업을 수행하는 것은 불가능합니다(무언가 잘못되었을 때 +를 클릭하는 경우 제외). 그래서 그것은 대화형이 될 수 없습니다.ssh … commandsshCtrlC일괄 처리.

    마치 누군가에게 이메일을 보내 뭔가를 해달라고 요청하는 것과 같은 느낌입니다. 즉각적인 응답을 기대하지 않으므로 로그인 쉘이 옳지 않다고 느껴집니다.

배경은 다음을 참조하세요."비로그인" 쉘 대신 "로그인" 쉘을 사용하는 이유는 무엇입니까? (그 중 - 공개 - 유일한 답변은 제가 작성했습니다) 그리고 로그인 쉘과 비로그인 쉘의 차이점은 무엇입니까?- 얼핏 훑어봐도 이 질문과 직접적인 관련이 있는 내용은 보이지 않았습니다.

관련 정보