SSH 로그인시 디렉토리를 자동으로 변경하려면 어떻게합니까?


87

내가 얻으려고 ssh. 내가 로그인 할 때 자동으로 특정 디렉토리로 변경 난에 다음과 같은 지침을 사용하여 작업하는 동작을 얻기 위해 노력했다 ~/.ssh/config:

Host example.net
LocalCommand "cd web"

하지만 로그인 할 때마다 다음이 표시됩니다.

/bin/bash: cd web: No such file or directory

비록 web내 홈 디렉토리 에는 확실히 폴더 가 있지만 . 절대 경로를 사용하더라도 동일한 메시지가 나타납니다. 분명히 cd web로그인 한 후 입력 하면 올바른 폴더로 이동합니다.

내가 여기서 무엇을 놓치고 있습니까?

편집하다:

따옴표 / 절대 경로의 다른 조합은 다른 오류 메시지를 제공합니다.

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

이것은 따옴표가 없어야하며 다른 오류가 발생한다고 생각합니다.


9
LocalCommand는 원격 시스템이 아닌 로컬 시스템에서 실행됩니다.
— Steve Kehlet

답변:


25

cd는 내장 쉘입니다. LocalCommand는 다음과 같이 실행됩니다.

/bin/sh -c <localcommand>

당신이 찾고있는 것은 실제로 SSH를 통해 달성 할 수 없습니다. bashrc / bash_profile과 같은 방식으로 쉘을 수정해야합니다.

<거의 10 년 후 편집 ...>

LocalCommand어쨌든 당신이 원하는 것이 아닙니다. 그것은 당신의 컴퓨터 에서 실행됩니다 . 당신은 원합니다 RemoteCommand. 이와 같은 것이 나를 위해 일했습니다 :

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes

1
그렇습니다. 대신 원격 서버에 cd명령을 넣을 수 있습니다 ~/.bashrc.
— vdboor

그거 짜증나네. 다른 의견에서 언급했듯이 서버에는 많은 호스트 이름이 있으며 사용 된 호스트 이름에 따라 다른 동작을 원했습니다. .bashrc에서 사용 된 것을 결정할 수없는 것 같아요?
— Gareth

가능하지 않을 수도 있습니다. ssh를 작은 쉘 스크립트 또는 호스트 이름을 내보낼 변수로 전달하는 별명 (예 : "ssh -t user @ host 'export connhostname = host; bash --login'")으로 바꾸는 것과 같은 것입니다. 그러나 당신은 정말로 매우 이상한 영역에 들어가기 시작했습니다. 아마도 더 좋은 질문은, 왜이 행동을 원하십니까?
— BMDan

솔직히 그렇게 큰 문제는 아닙니다. 이 서버에 로그인 할 때 대부분의 시간에 두 개의 디렉토리 중 하나를 사용합니다 (사용중인 호스트에 따라 다름)
— Gareth

77

이것은 작동합니다 :

ssh server -t "cd /my/remote/directory; bash --login"

디렉토리가없는 경우 작성하려면 다음을 수행하십시오.

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

bash경로 끝에 추가하지 않으면 cdcomand가 실행 된 후 종료 됩니다. 추가하지 않는 경우 그리고 --login다음이 ~/.profile공급되지 않습니다.


이것은 bash 프롬프트와 함께 올바른 위치에 있습니다. 완전한!
— 피터 Ehrlich

이것은 나에게도 효과가 있지만 ssh jump-host와 함께 사용하려고하면 작동하지 않습니다. 연결 종료 메시지가 나타납니다.
— 리카르도

43
  1. 박스에 로그인
  2. 편집하다 ~/.bash_profile
  3. 파일의 끝에 추가 cd /path/to/your/destination
  4. 저장 후 종료
  5. 상자에서 로그 아웃
  6. 다시 로그인하면 착륙해야합니다 /path/to/your/destination

3
일부 컴퓨터에서는 cd /path/to/your/destination에 ~/.bashrc대신 추가해야 할 수도 있습니다 ~/.bash_profile. 결과는 같아야합니다.
— Matthias

이것은 완벽하게 감사합니다-내 사용자 ID로만 제한됩니까, 아니면 다른 사용자 로그인에도 영향을 줍니까?
— hard_working_ant

당신이 수정하면 @BabyGroot ~/.bash_profile또는 ~/.bashrc그것은 단지 현재 사용자에 영향을 미칠 것입니다.
— rubenvarela

5

기본 .bashrc 파일을 ssh하고 재정의해야 할 경우 더 강력한 솔루션입니다. 원격 서버 환경에 여러 개의 docroot가 있고 여러 사용자가 사용하는 경우에 유용합니다.

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

좀 더 상세한:

  1. 첫 번째 명령은 컨텐츠를 사용하여 원격 서버의 디렉토리에 .bashrc_tmp파일을 작성 합니다./tmpcd /path/to/dir
  2. 다음 명령은 bash1 단계에서 지정한 구성 파일을 사용하여 실행 됩니다. 그러면 원하는 dir로 전환하고 default를 억제 할 수 있습니다 .bashrc.
  3. 이 전체 명령은로 래핑 alias되므로 ssh 클라이언트 명령 프롬프트에서 다음과 같이 호출 할 수 있습니다ssh_myserver

창의성 ... / tmp에 perms를 쓰는 한
— smci

4

ssh 설정에서이 지시문을 활성화 했습니까?

PermitLocalCommand yes

기본값은입니다.이 no경우 LocalCommand지시문이 무시됩니다.

또는 .bashrc파일에 명령을 추가해 보셨습니까 ?


그 지시어는 yes로 설정되었습니다 (그리고 오류 메시지가 표시되지 않으면 표시되지 않는다고 가정합니다). .bashrc에 사용 문제는 서버가 다른 호스트 이름을 가지고 있다는 것입니다, 나는 다른 시작 디렉토리로 번역 다른 호스트 이름을 싶습니다
— 가레스

각 호스트 이름에 다른 IP 주소가 없으면 요청한 호스트 이름을 서버가 알 수 없습니다. HTTP 요청은 요청 된 호스트 이름을 식별하기위한 친숙한 Host : 헤더를 제공하지만 SSH 연결은 그렇지 않습니다.
— Fosco

4

그래서 많은 웹 사이트 (스택 오버 플로우,이 웹 사이트)를 검색했지만 원하는 것을 찾지 못했습니다. 나는 내 자신의 쉘 스크립트를 만들었습니다. 여기에 붙여 넣습니다. 또한 $ PATH에 디렉토리를 복사 할 수 있습니다.

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

그래서이 후. 나는한다:

connect <foldername>

참고 : 경로 변수를 변경 한 후 로그 아웃했다가 다시 로그인해야 할 수 있습니다


'$ SHELL'은 항상 유효하지만 'bash'는 유효하지 않기 때문에 이전 제안보다 이것을 선호합니다. 또한 'exec'를 사용하는 것이 좋습니다.
— Dave

더 나은 개선은 'cd'가 성공적인지 확인하는 것입니다- "cd ~ / $ 1 && exec ..."
— Dave

3

당신의 ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

당신의 끝에 ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

내 보낸 변수를 포함하여 변수 전달을 사용 하여이 작업을 시도했지만 이러한 명령은 다른 쉘에서 실행됩니다.

당신이하려는 것을 테스트 할 때 인용되지 않은 절대 경로를 사용할 때 오류가 발생하지 않았습니다. ; pwd명령 끝에 추가 했는데 올바른 디렉토리가 표시되지만 결국 디렉토리는 ~입니다. cd쉘 시작 파일 에는 명령 이 없습니다 . 나는 다른 퍼팅 시도 cd somedir; pwd에 ~/.ssh/rc(아직도 그 자리에 다른과). configMOTD가 발급되기 전에 명령을 실행하고 rc명령 이후에 발행하지만, 쉘 전에 시작 파일이 공급됩니다. 다시 말하지만, 그것은 다른 껍질에서 일어나고 있습니다.

파일 별 전달 기술을 시도해보고 그것이 효과가 있는지 알려주십시오.


2

따옴표없이 시도해 보셨습니까? 내가 본 유일한 예제에는 그것들이 없으므로 cd \ web을 명령으로 실행하려고 할 수 있습니다.


좋아, 따옴표를 제거하는 것이 도움이되는 것처럼 보이지만 여전히 오류가 있습니다 (편집 된 게시물 참조)
— Gareth

1

옵션으로 -t다음을 시도 할 수도 있습니다 .

ssh server -t "cd /my/remote/directory; bash"

1

RemoteCommand예를 들어 대신 사용해보십시오

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $SHELL -il

RemoteCommand: 서버에 성공적으로 연결 한 후 원격 시스템에서 실행할 명령을 지정합니다. ( man ssh_config)

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