SSH가 사용하는 쉘을 선택 하시겠습니까?


31

사용자가 서버에 SSH를 연결할 때 사용되는 셸을 설정하는 방법 예를 들어 BASH를 견딜 수 없으며 ZSH를 사용해야 .zsh_profile합니다. 시스템에 ssh 할 때 ZSH가 프로파일 ( ) 과 함께로드되도록 어떻게해야합니까?

ssh로 많은 매개 변수를 전달하고 싶지 않습니다. 기본 셸을 설정할 수 없습니까?

답변:


34

Linux에서 실행 중이라고 가정하면 chsh명령을 사용할 수 있습니다 .

chsh -s /bin/ksh foo
chsh -s /bin/bash username

4
/etc/shells쉘을 선택할 수 있으려면 바이너리 경로가 있어야합니다 .
Kimvais

Ubuntu 16.04에는이 명령이 없습니다.
david.perez

@ david.perez 예 , passwd패키지 안에 있습니다.
디저트

인증이 LDAP를 통해 처리 될 때는 작동하지 않습니다.
Daniel Kats

10

man chsh 쉘 변경, 항상 작동하지는 않습니다

또는 exec /bin/zshbash 로그인 스크립트를 사용하면 bash 인스턴스가 셸로 대체됩니다.

아니면 할 수 있습니다 ssh host "zsh -l"


왜 -1 (15 자)입니까?
Noufal Ibrahim

그것은 소문자입니다L
driftcatcher

1
ssh -t마지막 옵션에 대해 TTY를 받으려면 필수입니다. 기본적으로 (와 같은 zsh -l) 명령 이 제공되면 OpenSSH는 비 로그인 쉘을 수행하여 TTY를 할당 -l하지 않으며 (로그인 후에 실행되기 때문에) TTY를 변경하지 않습니다.
Franklin Yu

8

기본 쉘을 변경하려면 / etc / passwd를 편집하십시오 (권한이 있거나 시스템 관리자에게 문의하십시오).


어떤 이유로 최근에 만든 사용자에게는 기본 셸이 없었습니다. 이것은 나를 위해 일했습니다. 감사.
mimoralea

2
감사합니다.이 답변이 훌륭합니다. 나는 여기에도 껍질이 없었습니다. myusername : x : 1000 : 1000 :: / home / myusername : 행을 찾아서 끝에 / bin / bash를 추가했습니다. 로그 아웃하고 로그인하면 내 ssh 세션은 bash를 사용합니다 :)
Stewart Evans

6

기본 쉘을 변경할 수 없으면 ssh -t user@host 'zsh -l'작동합니다.

-t플래그는 의사 -tty 할당을 강제 실행 -l하고 로그인 쉘을 생성합니다 .


4

로컬 .zshrc서버를 어떻게 원격 서버에 넣을 수 있는지 잘 모르겠습니다 (영구적으로 저장하지 않음). 원격 서버에서 로그인 쉘을 변경하는 데 도움이됩니다.

공유 계정 zsh이므로이 방법으로는 본인 만 사용할 수 있습니다 .

이것을 ~/.ssh/config로컬 컴퓨터 의 파일에 추가하십시오 .

Host yourServer
    HostName <IP, FQDN or DNS resolvable name>
    IdentityFile ~/.ssh/<your keyfile>
    RemoteCommand zsh -l
    RequestTTY force
    User <yourUsername>

아래와 같이 원하는 것을 달성하는 해킹 방법이있을 수 있습니다.

경고 이것은 보증이 없으며 '현명한'것처럼 보이지 않지만 로컬 파일을 서버에 넣고 이것을 사용하여 로그인 셸에서 소스로 관리했습니다.

Host someHost
    HostName someIP
    IdentityFile ~/.ssh/somekey.pem
    RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
    PermitLocalCommand yes
    LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
    RequestTTY force
    User someUser

어떻게 작동합니까?

  • RemoteCommand 원격 측에서 실행해야 할 사항을 정의합니다.
  • LocalCommand로컬에서 실행해야 할 사항을 정의합니다. 로컬 파일을 원격 서버에 복사하여 소싱합니다. 다음은 catch입니다. 원격 호스트에 '성공적으로'연결 한 후에 만 ​​발생합니다.

의미:

  1. 리모컨에 연결되어 있고 열려 있어야합니다
  2. 원격 쉘에 아직 파일이 없으므로 파일이있을 때까지 기다려야합니다. sleep
  3. 로컬은 sftp파일을 원격 서버에 넣고 원격 서버를 깨우고 sleep스크립트를 소스로 사용합니다.

그것은 슈퍼 해킹입니다, 더 좋은 방법이 있는지 알고 싶습니다.

업데이트 : '긴'수면 시간 대신 사용할 수 있습니다.
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.