내 sysadmin이 변경을 거부하면 bash를 로그인 쉘로 사용하는 방법


38

내가 일하고있는 유닉스 sysadmin은 로그인 쉘을에서 (으) ksh로 변경하기 위해 액세스를 꺼려 합니다 bash. 그는 다양한 변명을주었습니다. 가장 재미있는 것은 그들이 모든 스크립트를 작성했기 때문에 ksh내가 실행하려고하면 작동하지 않을 것입니다. 그가이 아이디어를 어디서 얻었는지 모르겠지만 설득 할 수 없기 때문에 대안이 있습니까?

( chsh이 컴퓨터에 설치되어 있지만 로그인을 위해 공개 / 개인 키 쌍을 사용하는데 비밀번호가 없으므로 비밀번호를 chsh묻는 메시지가 표시 되면 아무 것도 제공하지 않습니다.)

답변:


69

~/.profile로그인하면 로그인 쉘 (ksh) 이 파일 을 읽습니다. 해당 로그인 쉘이 bash로 대체되도록 지시 할 수 있습니다. 몇 가지 예방 조치를 취해야합니다.

  • 대화식 인 경우 로그인 쉘만 교체하십시오. 이것은 중요합니다. 그렇지 않으면 그래픽 모드로 로그인하는 것이 작동하지 않을 수 있습니다 (시스템에 따라 다름 : 일부 시스템 ~/.profile은 xdm 또는 이와 유사한 방식으로 로그인 할 때 일부 시스템을 읽지 못함 ) ssh foo '. ~/.profile; mycommand'.
  • bash가 사용 가능한지 확인하여 어떤 이유로 실행 파일이없는 경우에도 로그인 할 수 있습니다.

bash를 로그인 쉘로 실행할지 여부를 선택할 수 있습니다. 로그인 쉘로 만드는 유일한 차이점은로드 ~/.bash_profile또는 ~/.profile입니다. 따라서 bash를 로그인 쉘로 ~/.bash_profile실행하는 경우 bash를 재귀 적으로 실행하지 않도록주의하십시오 ~/.profile. ~/.profileksh가 아닌 bash로 실행하면 실제로 이점이 없으므로 수행하지 않는 것이 좋습니다.

또한 SHELL터미널 변수와 같은 프로그램이 해당 셸을 호출하도록 환경 변수를 bash로 설정하십시오 .

bash로 전환하는 코드는 다음과 같습니다. 끝에 넣습니다 ~/.profile.

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash"
      fi
    fi
esac

17
훌륭한 답변! stackexchange 에는 맥주 보내기 버튼이 필요 합니다.
iconoclast

먼저 감사합니다. .profile로그인 쉘에서만 작동합니다 (OP 필요). Windows 10의 원격 데스크톱 연결을 사용하여 Linux 워크 스테이션에 로그인 한 다음 그놈에서 터미널을 엽니 다. zsh내 시스템 관리자가 알려주는 동안 원합니다 bash. 이 경우에 .bashrc대신 스 니펫을 추가해야합니다 .profile.
Weekend

12

이것은 약간 엉뚱하지만 bash로그인하면 .profile홈 디렉토리에 파일 을 만들어서 사용중인 쉘이 될 수 있습니다.

SHELL=`type -P bash`
exec bash -l

ksh세션 이 세션으로 대체됩니다 bash. 로그인 할 때마다 새 세션 을 수동으로 시작한 것처럼 두 번 입력 exit(또는 ^D) 하지 않아도됩니다 bash.

echo $SHELL

로 경로를 반환합니다 bash.


3
물론 실행 전에 행을 추가하여 $ SHELL을 상당히 쉽게 변경할 수 있습니다.
derobert

2
새로운 쉘이 로그인 쉘이되기를 원한다면 아마 당신은 아마해야한다 exec bash -l.
jw013

1
마지막 의견 : type이 (가) 이상 권장 됩니다 which.
jw013

1
나는 그것을 얻지 못한다! 하지 않음 bash도 읽을 .profile무한 루프를 생성하여? 나는 선을 따라 뭔가 exec bash가 당신이 원하는 것에 동의 하지만, 당신은 당신의 로그인 ksh 에만 그것을 수행해야 하므로 if 문이 필요합니다!
Bananguin

1
@ user1129682없는 경우 ~/.bash_profile또는~/.bash_login
Ulrich Dangel

4

Giles의 답변에는 bash를 실행할 때 -l 플래그가 추가되어 로그인 프로파일 스크립트가 새 bash 셸에서 제공됩니다. (예를 들어 RHEL의 /etc/profile.d/에있는 항목). 스크립트는 다음과 같아야합니다.

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash" -l
      fi
    fi
esac

-l옵션 을 추가하라는 이유를 설명 할 수 있습니까 ? 나는 이것을 아무런 문제없이 몇 달 동안 사용했습니다.
cokedude

1

csh/tcsh@Gilles가 뽑은 상위권 에서 영감 을 얻은 답변 은 다음과 같습니다.

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif

0

솔라리스 :

usermod -s /bin/bash root

1
usermod는 관리자 권한이 필요하지 않으며 질문은 "... 내 관리자가 거부하면 ..."입니까?
축복받은 Geek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.