루트 액세스없이 zsh 기본 쉘 작성


52

학교 컴퓨터를 사용하고 있는데 zsh대신에 사용하고 싶습니다 bash. 기본 쉘로 만들고 싶지만 $ chsh -s $(which zsh)관리자 권한이 없기 때문에 명령을 실행할 수 없습니다 .

해결 방법으로 열 때 .bashrc자동으로 호출 zsh되는 내용을 넣을 수 있는 방법이 있습니까?

명확히하기 위해 zsh이미 설치되어 있습니다.


2
네, 방금 추가 zsh.bashrc파일. 로그 아웃 및 로그인 및 완료!
fedorqui

미안합니다. 그러나 질문을 끝내기 zsh위해 첫 번째 줄을 썼습니까?

3
.bashrc에 zsh를 넣으면 bash명시 적으로 호출 된 경우에도 항상 실행됩니다 . .bash_profile대신에 배치하는 것이 좋습니다.
konsolebox

터미널 환경 설정에서 zsh를 기본 쉘로 설정할 수 있습니다 (새 프로파일 작성).
lmaooooo

답변:


68

.bash_profile홈 디렉토리에서 작성 하고 다음 행을 추가하십시오.

export SHELL=/bin/zsh
exec /bin/zsh -l

업데이트 : .profile기본 쉘이 bash가 아닌 경우 일반적인 솔루션으로 작동 할 수 있습니다. .profileZsh에 의해 호출되어 중복 될 수 있는지 확실 하지 않지만 간단한 확인으로 안전하게 수행 할 수 있습니다.

export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l

또한 다음의 값에 의존 which하는 동적 경로를 얻는 데 사용할 수 있습니다 .zsh$PATH

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l

Linux 관리자 (루트)가 기본 쉘을 bash (zsh 아님) 이외의 다른 것으로 바꾸면 (예 : ksh) 어떻게됩니까? 그런 다음 .bash_profile참조되지 않습니다. 이것을 .profile대신 넣는 것은 어떻습니까?
Joshua Huber

@JoshuaHuber 마지막으로 테스트 한 결과 .profile작동하지 않았습니다. 또한에 .profile의해 호출 되지 않습니다 Zsh? 중복 될 수 있습니다. 그래도 아직 확인하지 않았습니다. (업데이트 : 지금은 어떤 실수를했는지 잘 모르겠습니다.) .profile?
konsolebox

1
@konsolebox Bash 는 존재하지 않는 .profile경우 에만 소스를 만듭니다 .bash_profile( .bash_profile물론 소스를 수동으로 소스하지 않는 한 ). 구체적으로는, 파일 배시 소스 첫 번째는 [ .bash_profile> .bash_login> .profile]는 발견. .profilePOSIX (Bourne shell) 호환성 기능 만 찾습니다 .
불꽃

@pyrocrasty 실제로. 매뉴얼에서 말했듯이 "해당 파일을 읽은 후 ~ / .bash_profile, ~ / .bash_login 및 ~ / .profile을 순서대로 찾아서 존재하고 읽을 수있는 첫 번째 명령을 읽고 실행합니다. "
konsolebox

그것은을 가진 새 터미널 프로파일을 설정하는 근무 내 쉘 대신 실행 사용자 정의 명령 으로 변경을 zsh. .bash_profile.profile(파일이 심지어 대학 컴퓨터에 페도라 26 실행되지 않은) 작동하지 않았다.
lmaooooo

12

일반적으로 chsh루트가 아닌 사용자로 사용할 수 있습니다 . 그러나 NIS 및 LDAP와 같은 네트워크 형태의 사용자 데이터베이스를 사용하는 사이트에서는 대개 비활성화되어 있습니다. 대신 ypchsh(NIS) 또는 chsh.ldap(LDAP) 가있을 수 있습니다 .

chsh일반적으로 승인 된 일부 쉘 (일반적으로에 나열된 쉘) 만 허용합니다 /etc/shells.

chsh사이트에서 또는 해당 변형을 사용할 수없는 경우 , 로그인 쉘을 exec선호하는 쉘로 정렬 하고 SHELL변수가 선호하는 쉘을 가리 키도록 설정하십시오 .

  • 로그인 쉘이 다음 sh과 같은 경우 dash또는 ksh편집해야 할 파일은 다음 과 같습니다 ~/.profile. 당신이 알아서 할 필요가 있으므로,이 파일은 일부 비 대화식 세션 시작 스크립트 (X11 세션에 대한 예를 들어)에 의해뿐만 아니라 대화 형 세션의 시작 부분에 읽기를 실행하는 것을주의 : 전용 전화 exec(현재 프로세스를 대체하는) 경우 현재 쉘은 대화식입니다. Bourne 쉘 ( /bin/shSolaris 10 및 그 이전 버전)을 제외하고 i옵션 목록 ( $-)에 쉘이 대화식임을 알 수 있습니다 .

    preferred_shell=
    if [ -x /bin/zsh ]; then
      preferred_shell=/bin/zsh
    fi
    
    if [ -n "$preferred_shell" ]; then
      case $- in
        *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";;
      esac
    fi
    

    zsh가을 (를) 읽 .zprofile도록하려면 -l옵션을 전달하십시오 .

  • 로그인 쉘이 bash인 경우 위와 같이 진행할 수 있습니다. 또는이 명령을에 넣을 수 있습니다 ~/.bash_profile. 대부분의 세션 시작 스크립트는 읽지 ~/.profile않고 읽지 ~/.bash_profile않지만 bash 및 read .bash_profile에서 실행되는 스크립트를 보았 으므로 exec비 대화식 쉘 을 호출하지 않도록주의해야합니다 .

  • 로그인 쉘이 csh 또는 tcsh 인 경우 chsh 또는 관리자 권한없이 기본 쉘 변경의 예를 참조하십시오.


1

나는 명령 chsh이 바로이 목적을위한 것이라고 믿는다 . 모든 Linux / Unix 배포판이이를 지원하는지 확실하지 않습니다. 의 매뉴얼 페이지를 확인하십시오 chsh.


일부 시스템은 또한로 구성되어 passwd -s있습니다.
Stéphane Chazelas

1

chsh관리자 권한이 없어서 실행할 수없는 경우 , 다른 사람대화하십시오 .

예를 들어 시스템이 파일이 아닌 NIS 또는 LDAP를 사용하기 때문에 사용중인 시스템이 작동하지 chsh않도록 구성되어 있기 때문에 루트가 아닌 것으로 사용할 수 없습니다 . 또는 시스템 관리자가 일부 제어권을 유지하려고 할 수도 있습니다.chsh/etc/passwd

셸 변경 절차는 조직의 정책에 따라 다릅니다. chsh일반적으로 수행 하는 로컬 명령이있을 수 있습니다 . 또는 쉘 변경을 요청하는 지원 티켓을 제출해야 할 수도 있습니다.

대부분의 다른 답변은 좋지만 관리자가 적절하게 응답하면 시작 스크립트를 해킹하는 것을 원하지 않을 수 있습니다. zsh -l관리자가 내 계정을 업데이트 할 때까지 로그인 한 후 수동으로 호출했을 것입니다 .

명심해야 할 또 다른 사항 : 때때로 다른 쉘이 동일한 시작 파일을 사용할 수 있습니다. 예를 들어, shbash실행할 수 있습니다 모두 $HOME/.profile, 및 cshtcsh실행할 수 있습니다 모두 $HOME/.login$HOME/.cshrc(하지만 같은 쉘 특정 시작 파일 .bashrc, .bash_profile.tcshrc이들을 대체 할 수 있습니다). 기본 쉘이 /bin/csh있고를 사용하려는 경우 호출하도록 /bin/tcsh업데이트 하면 무한 루프가 발생할 수 있습니다. 특정 시작 파일 을 실행하지 않으므로 문제가되지 않습니다 ..login/bin/tcsh -lzshbash

대부분의 쉘은 (실행중인 쉘 식별 변수 설정 $BASH_VERSION, $tcsh, $ZSH_VERSION)를. 선호하는 쉘을 호출하기 위해 시작 코드를 작성하려는 경우,이를 쉘로 묶는 것은 좋은 생각 if이 아니므로 해당 쉘을 아직 실행하지 않은 경우에만 실행됩니다. konsolebox의 답변 에서 코드 사용 :

if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
    export SHELL=/bin/zsh
    exec /bin/zsh -l
fi

(확인의 추가 복잡성은 "${ZSH_VERSION:-unset}"단순히 정의되지 않은 변수에 대한 참조를 오류로 만드는 옵션 인을 "$ZSH_VERSION"수행했을 가능성을 허용합니다 set -o unset.)


1

몇 가지 시나리오를 생각할 수 있습니다.

  1. zsh에 있지 않으며 /etc/shellsOP zsh는 명령 프롬프트에서 입력하지 않고 사용하려고 합니다. 가능한 해결책.

    a) 로그인시 프로파일 트릭을 사용하여 실행하십시오. 이것은 실제로 쉘을 변경하는 것만 큼 효과적입니다.

    b)는 추가 관리자를 구걸 zsh하는 /etc/shells그래서 당신이 수 chsh를하는 방법

    c) 관리자에게 쉘 변경을 요청하십시오. 이것은 당신에게 능력을 잃게됩니다 있기 때문에, 현명하지 않다 ftp인치 만 사용할 수 있습니다 ftp당신은 쉘이있는 경우/etc/shells

  2. 사용자는 제한된 쉘을 피하려고합니다 . rbash또는rsh

    .profile편집 가능한 경우 편집하여 PATH확장 할 수 있습니다. 일단 /bin경로에, 당신은 그 시작되어 bash내부에서 rsh/rbash받는 액세스 얻고, chsh당신이 쉘을 변경할 수 있도록 명령을 사용합니다. 많은 명령에는 제한된 쉘을 이스케이프하고 다시 액세스 할 수있는 쉘 이스케이프가 있습니다 chsh.

  3. chsh다른 이유로 인해 작동하지 않습니다. 가능성 1의 해결책 a도 여기에 대한 대답입니다.

시나리오 2는 기본 쉘을 실제로 변경하는 유일한 이유입니다 (너무 제한적 임).


-3

제공된 답변이 실제로 zsh기본 쉘을 만드는 것으로 생각하지 않습니다 . 사용자가 기본 쉘에 로그인하자마자 쉘을 zsh로 간단하게 변경합니다 . 사용자는 여전히 로그인 DEFAULT SHELL하지만 쉘을 사용하여zsh

기본 쉘을 변경하려면 다음을 사용하십시오.

usermod -s /path/to/shell username 

그렇게하려면 루트가되어야합니다.

그렇지 않으면 위의 해결 방법 이 유용합니다.

댓글에서 추가

chsh -s /path/to/zsh  # considered as standard as compared to usermod

사용자가 직접 호출 할 수 있습니다.


4
이 질문은 시스템 사용자 데이터베이스 수정 (이 답변에서 루트가 필요한 비트)이 옵션이 아니라는 것을 분명히 나타냅니다.
Caleb

3
chsh -s /path/to/zsh더 표준적이고 일반적으로 (항상 그런 것은 아님) 항상 루트 액세스와 달리 루트 액세스가 필요 usermod하지 않습니다. 따라서 귀하의 답변에는 질문이 이미 작동하지 않는 것보다 더 많은 문제가 있습니다.
Gilles 'SO- 악마 그만해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.