`ssh <host>`는 로그인 쉘이지만`ssh <host> <command>`는 그렇지 않습니까?


11

ssh <host> <command>구문을 사용하여 SSH 호스트에서 직접 명령을 실행할 때 (또는 ) 의 출력은 .bashrc보이지만 출력은 보입니다 ..bash_profile.profile

예를 들어, 다음 명령을 두 파일의 맨 위에두면

echo ${BASH_SOURCE[0]}

수동으로 소스 .bash_profile(어느 소스 .bashrc차례), 내가 볼 수 있습니다

$ . .bash_profile
.bash_profile
.bashrc

이것은 ssh <host>명령 형식을 사용하여 SSH를 통해이 컴퓨터에 원격으로 로그인 할 때와 동일한 결과 입니다. (그리고 내가 .bash_profile일시적으로 다른 곳에 뒀다면 ,이 선들 중 어느 것도 에코되지 않습니다.)

그러나의 ssh <host> <command>형식으로 원격 컴퓨터에서 직접 명령을 실행 ssh하면 출력은 다음과 같습니다.

$ ssh <host> echo foo
/home/rlue/.bashrc
foo

나의 이해의 차이이다 .bash_profile그리고 .bashrc전자가 있다는 것이다 로그인 쉘 후자가있는 동안 대화 형, 비 로그인 쉘 .

나는 다음을 결론 지었다.

  1. ssh <host>자원에만 .bash_profile반면,
  2. ssh <host> <command>소스 만 .bashrc, 즉
  3. 전자는 로그인 쉘이고 후자는 로그인 쉘이 아닙니다.

이러한 결론이 맞습니까? ssh <host> <command>대화 형 비 로그인 셸로 취급되는 이유는 무엇 입니까? SSH가 여전히 명령을 실행하기 위해 원격 시스템에 로그인하지 않습니까?


.bashrc?의 출력 이 파일은 출력을 생성하지 않아야합니다. 모든 출력은 .bashrcssh를 전송으로 사용하여 모든 도구를 중단 할 수 있습니다.
kasperd

충분합니다. 이 경우 몇 줄 .bashrc은 오류가 발생하지만 비슷한 줄은 오류가 발생 .bash_profile하지 않았습니다. 문제가되는 행을 수정하기 전에 불일치를 조사 할 기회를 얻었습니다.
Ryan Lue

답변:


12

OpenSSH (대부분 실행중인 것)는 로그인 셸을 만들지 여부를 결정하며 특정 명령을 실행하지 않는 경우에만 로그인 셸을 만듭니다. 보낸 사람 man ssh:

 If command is specified, it is executed on the remote host instead of a
 login shell.

따라서 로그인 쉘을 만들지 여부에 관계없이 ssh 서버에 대한 구현 선택이며 실행 명령을 제공하면 그렇지 않습니다.

ssh로그인을 수행하는 동안 명령을 실행하고 종료 해야하는 경우 로그인 환경을 얻는 것보다 해당 명령을 실행하기 위해 쉘을 만드는 것과 훨씬 유사합니다. 그런 점에서 OpenSSH를 작성하는 사람들은이를 일종의 작업으로 취급하기로 결정한 것 같습니다.

비 대화식, 비 로그인 셸을 만들어 명령을 실행합니다. 왜냐하면 다른 컨텍스트 / 쉘에서 명령을 실행하는 정신이기 때문입니다. 그러나 일반적으로 비 대화식 쉘은 자동으로 소싱되지 않으며 ~/.bashrc여기서 분명히 발생합니다. bash실제로 우리를 도와 주려고합니다. 에서 워드 프로세서

원격 쉘 데몬에 의해 호출

Bash는 원격 쉘 데몬 (일반적으로 rshd) 또는 보안 쉘 데몬 (sshd)에 의해 실행될 때와 같이 표준 입력이 네트워크 연결에 연결된 상태에서 언제 실행되고 있는지 확인합니다. Bash가 이러한 방식으로 실행되고 있다고 판단되면 해당 파일이 존재하고 읽을 수있는 경우 ~ / .bashrc에서 명령을 읽고 실행합니다. sh로 호출하면이 작업을 수행하지 않습니다. --norc 옵션을 사용하여이 동작을 막을 수 있고 --rcfile 옵션을 사용하여 다른 파일을 강제로 읽을 수 있지만 rshd 나 sshd는 일반적으로 해당 옵션으로 셸을 호출하거나 파일을 지정할 수 없습니다.


"... 로그인 쉘 대신 원격 호스트에서 실행됩니다." 나는 이분법을 얻지 못한다. 명령이 실행되어 원격 호스트에 대신 로그인 쉘에서 , 또는이다 명령 원격 호스트에서 실행, 대신 로그인 쉘 이 실행되고 있습니까? 전자의 경우는 어떻습니까? (정상적으로 둘 다 아닌가요? ) 후자가 여전히 일부 쉘 의 컨텍스트에서 실행 됩니까? (로그인이 아닌 대화식?) 제 질문은 의미론에 관한 것입니다. "로그인 쉘"은 무엇을 의미하며 OpenSSH가 단일 명령 용으로 작성하지 않도록 설계된 이유는 무엇입니까?
Ryan Lue

@RyanLue 쉘의 서로 다른 "풍미"는 각각 특정 작업을보다 쉽고 더 안전하고 최적화 ssh할 수있게합니다. 로그인 쉘이 수행하는 추가 단계가 필요하지 않으므로 이점을 건너 뜁니다. 실제로 실행되는 쉘이 있습니다. 주로 환경을 설정하는 것으로 가정하고 로그인 한 사용자에게 쉘을 제공하지 않기 때문에 사용자가 새로운 쉘을 시작한 것처럼 처리합니다. 명령
에릭 Renouf

"실제로 실행되는 쉘이 있는데, 나는 주로 환경을 설정한다고 가정합니다 ..."<그러나 나는 이것을 실험 해 ssh <host> <command>보았고 기존 로그인 쉘의 환경을 상속하지 않는 것으로 보입니다 . 예를 들어, 소싱 하지 않은 상태$ ssh <host> \$PATH 로 경로를 반환합니다 (또는 그대로). 실용적인 의미에서 왜 그 단계를 우회하고 싶습니까? .bash_profile.profile
Ryan Lue

"... 구현 자들은 어떤 상황에서, 예를 들어, 명령을 실행하고 리턴하도록 요청하는 경우 로그인 쉘이 수행하는 추가 단계에서 필요 / 이로 울 필요가 없으며 따라서이를 건너 뛰기로 결정했습니다."< 이 디자인 선택에 대한 설명 / 통찰력을 찾고 있습니다. 필자 는 PATHin을 정의 .profile합니다. 원격 호스트에서 임의의 명령을 실행하기 전에 정확히로드하려는 것이 아닌가?
Ryan Lue

1
@RyanLue Boks ssh 서버는 ssh의 고유 한 용도를 구별하고 각각에 대한 권한을 부여 할 수 있습니다. 원격 로그인, 원격 실행, 원격 복사, 아마도 이것이 당신이 묘사 한 행동을하는 이유를 이해하는 데 도움이 될 것입니다. 보안 수준이 높은 환경에서는 원격 로그인 (대화식 사용)이 너무 많이 요구 될 수 있습니다. .bash_profile 또는 chroot에서 rbash / rksh 및 'logout'을 사용하여 Openssh를 제한 할 수 있습니다.
bbaassssiiee

3

이 동작 의 이유 는 쉘보다 낮은 레벨에 있습니다. ssh host( "로그인 쉘"경우) 원격 호스트에서 의사 터미널 을 사용 하여 sshd서버 프로세스와 쉘 간에 통신 합니다. ssh host command파이프 사이 사용 sshdcommand대신. 의사 터미널은 쉘과 같은 명령 해석기 또는 스크립트 언어 의 " 읽기 평가 인쇄 "모드를 대화식으로 사용하기 위해 필요합니다 . 오타를 통해 백 스페이스 할 수있는 것과 같이 인간에게 친숙한 기능을 구현합니다. 그러나 더 많은 오버 헤드가 있으며 (구성에 따라) 임의의 데이터가 수정되지 않은 것을 통과하지 못하므로 SSH는 상호 작용이 일어나지 않을 때 데이터를 사용하지 않습니다.

때때로 SSH의 명령 / 명령 휴리스틱은이를 잘못 얻습니다. -t-T스위치 로 재정의 할 수 있습니다 . 예를 들어, 원격 시스템에 로그인하고 일시 중단 된 screen세션을 즉시 다시 연결 하려면 수행해야합니다 ssh -t host screen -R. 터미널에 연결되어 있지 않다고 불평 ssh host screen -R하게됩니다 screen. 실제로 사용 하고 싶을 때 상황을 생각할 수는 없지만 -T찾은 경우가 있습니다.


1

먼저 다른 유형을 볼 필요가 있습니다.

https://unix.stackexchange.com/questions/170493/login-non-login-and-interactive-non-interactive-shells

bashrc를 열면 처음에 다음을 볼 수 있습니다.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

즉, 시스템에 어떻게 액세스하고 있는지에 따라이 파일은 내부에 코드를로드합니다.


그러나 이것은 흥미로운 질문을 제기합니다 .bashrc. 비대화 형 컨텍스트에서 호출 된 경우 ( 즉, "프롬프트 명령문"/ $PS1변수 가없는 경우) 소스되지 않도록 작성 될 수 있습니다 . 그러나 ssh <host> <command> 확실히 비대화 형이다 ; 즉, 명령 프롬프트 가 발생하지 않습니다 . 그렇다면 OpenSSH가 로그인 .bashrc이 아닌 대화식 유스 케이스 인 로그인이 아닌 대화 형 프롬프트 (소스를 시도하는 프롬프트)를 작성하도록 설계된 이유는 무엇 입니까?
Ryan Lue
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.