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.