비대화형 로그인 셸에서 텍스트를 표시하는 방법

비대화형 로그인 셸에서 텍스트를 표시하는 방법

나는 필요하다:

다음 ssh 명령을 입력할 때 쉘이 특정 텍스트를 표시할 수 있도록 /etc/bashrc를 변경하려고 합니다.

ssh user@ip "whoami"

그러나 쉘이 비대화형 로그인 쉘일 때 수행할 작업을 나타내는 파일의 행을 이해하지 못하기 때문에 여기서 정확히 무엇을 변경해야 하는지 이해하지 못합니다.

내가 시도한 것:

/etc/bashrc를 변경하지 않으면 쉘이 이 명령 다음에 사용자 이름을 반환하므로 $PS1의 값을 변경해야 할 것 같습니다. 변경해 보았지만 성공하지 못했습니다.

또한 BASH_ENV가 비대화형 비로그인 쉘에 중요하다는 것을 검색했지만 제 경우에는 쉘이 비대화형입니다.로그인껍데기. 그럼 $BASH_EVN도 사용해야 할까요? 이것을 /etc/bashrc에 추가해야 합니까?

답변1

~/.bashrc동등한 시스템 전체 파일(있는 경우)은 /etc/bash.bashrc일반적으로 비대화형 호출로 읽혀지지 않습니다 bash. 또한 호출을 통해 대화형으로 읽혀지지 않습니다.로그인쉘 호출은 일반적으로 버그가 있는 기능으로 간주되지만 종종bash_config 파일조달을 통해 이를 해결하기 위한 문서화bashrc상호 작용할 때.

에서는 ssh user@host 'some shell code'( 실행 중 로그인 쉘인 bash경우 ) 대화형 호출도 아니고 로그인 쉘 호출도 아닙니다.userhostsshdhostbash -c 'some shell code'

이제 시스템의 인터프리터가 빌드될 때 bash호출될 때 bashrc 파일을 얻을 수 있습니다.sshdbash/* #define SSH_SOURCE_BASHRC */댓글이 없습니다.config-top.h소스 파일의 일부 운영 체제(데비안과 같은) 하다.

bash이러한 시스템을 사용하는 경우 다음을 확인하여 bashrc에서 호출 하는지 알 수 있어야 합니다 .ssh host 'some bash code'

  • 이는 비대화형 호출입니다 bash.[[ $- != *i* ]]
  • 그것은 다음과 같이 불린다 bash -c <some-code>: [[ $- = *c* ]]. 런타임을 사용할 때 -cbash는 일반적으로 대화형이 아니므로 이전 확인이 중복된 것으로 간주될 수 있습니다. bash로 실행하는 경우 예외입니다 bash -ic 'some code'.
  • bash와 동일한 휴리스틱을 ssh사용 한다고 합니다 .[[ -v SSH_CLIENT || -v SSH2_CLIENT ]]
  • $SHLVLbash예 1( Ssh 세션에서 다시 실행되는 상황을 피하기 위해 , 이러한 경우 bashrc비대화식으로 실행해서는 안 되지만 bashrc명시적으로 소스가 있는 경우만 다룹니다.) [[ $SHLVL = 1 ]]1. 이것이 여전히 완벽한 것은 아닙니다.

그래서 상단에는bashrc:

if [[ $- != *i* && $- = *c* && (-v SSH_CLIENT || -v SSH2_CLIENT) && $SHLVL = 1 ]]; then
  printf>&2 'I was most likely invoked as ssh host %q\n' "$BASH_EXECUTION_STRING"
  if [[ $BASH_EXECUTION_STRING = whoami ]]; then
    echo Something specific here
  fi
fi

1 아래와 같이 (숫자 $SHLVL = 1비교)가 아닌 (문자열 비교)를 수행한다는 점에 유의하세요.$SHLVL -eq 1후자를 실행하면 명령 주입 취약점이 발생합니다.. 이는 $SHLVL01, 0x1...과 같은 숫자 1의 다른 표현을 포함하고 싶지 않기 때문에 동일해야 합니다.

관련 정보