특정 디렉토리로 직접 ssh 할 수 있습니까? ssh somehost somehost에 오신 것을 환영합니다! somehost ~] $

종종 여러 서버 중 하나에 로그인하여 해당 머신의 여러 디렉토리 중 하나로 이동해야합니다. 현재 나는 이런 종류의 것을한다 :

localhost ~] $ ssh somehost

somehost에 오신 것을 환영합니다!

somehost ~] $ cd / some / directory / somewhere / named / Foo
somehost Foo] $

어떤 호스트와 어느 디렉토리에 들어가야하는지 결정할 수있는 스크립트가 있지만이를 수행하는 방법을 알 수는 없습니다.

localhost ~] $ go_to_dir 푸

somehost에 오신 것을 환영합니다!

somehost Foo] $

이 작업을 수행하는 쉽고 영리한 방법이 있습니까?



답변

다음을 수행 할 수 있습니다.

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"

이런 식으로 directory_wanted에서 바로 쉘을 얻을 수 있습니다.


설명

-t의사 터미널 할당을 강제합니다. 이것은 원격 컴퓨터에서 임의의 화면 기반 프로그램을 실행하는 데 사용할 수 있습니다. 예를 들어 메뉴 서비스를 구현할 때 매우 유용합니다.

-tssh에 로컬 tty가없는 경우에도 여러 옵션이 tty 할당을 강제합니다.

  • 사용하지 않으면 -t프롬프트가 나타나지 않습니다.
  • 추가하지 않으면 ; bash연결이 닫히고 로컬 컴퓨터로 제어권이 반환됩니다.

답변

추가 할 수 있습니다

cd /some/directory/somewhere/named/Foo

당신에 .bashrc파일 (또는 .profile다른 호스트에서 또는 무엇이든 당신이 그것을 호출). 그런 식으로, 당신이 무엇을하든 어디서 ssh왔든, 서버에 로그온 할 때마다 서버 cd는 당신을 위해 적절한 디렉토리에 있을 것이고 , 당신이해야 할 일은 ssh평상시와 같이 사용하는 것입니다.

저주로, rogeriopvl의 솔루션도 효과가 있지만 조금 더 장황하고, (별칭을 만들지 않는 한) 매번 그렇게해야한다는 점을 기억해야하므로 덜 재미 있습니다.


답변

SSH와 CD를 서버에 연속적으로 sshcd 라는 도구를 만들었습니다 . 당신이 제시 한 예를 들어, 당신은 단순히 다음을 사용합니다 :

sshcd somehost:/some/directory/somewhere/named/Foo

질문이나 문제가 있으면 알려주세요!


답변

내가 선호하는 방법은 SSH 구성 파일 (아래 설명 참조)을 사용하는 것이지만 사용법에 따라 가능한 솔루션이 몇 가지 있습니다.

명령 줄 인수

이 접근법에 대한 가장 좋은 대답은 christianbundy의 대답에 대한 대답이라고 생각합니다.

ssh -t example.com "cd /foo/bar; exec \$SHELL -l"

큰 따옴표를 사용하면 이스케이프되지 않은 경우 로컬 시스템에서 변수를 사용할 수 있습니다 ( $SHELL여기있는 그대로). 또는 작은 따옴표를 사용할 수 있으며 사용하는 모든 변수는 대상 시스템의 변수입니다.

ssh -t example.com 'cd /foo/bar; exec $SHELL -l'

배쉬 기능

bash 함수로 래핑하여 명령을 단순화 할 수 있습니다. 이것을 입력하고 싶다고 가정 해 봅시다.

sshcd example.com /foo/bar

이것을 다음에 추가 하여이 작업을 수행 할 수 있습니다 ~/.bashrc.

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }

디렉토리의 원격 시스템에 존재하는 변수를 사용하는 경우, 이스케이프하거나 작은 따옴표로 묶어야합니다. 예를 들어, 이것은 JBOSS_HOME원격 시스템 의 변수에 저장된 디렉토리로 cd됩니다 .

sshcd example.com \$JBOSS_HOME

SSH 구성 파일

추가 명령 줄 인수를 사용하지 않고 일반 ssh 명령을 사용하여 특정 (또는 모든) 호스트에 대해이 동작을 항상 확인하려면 ssh 구성 파일에서 RequestTTYRemoteCommand옵션을 설정할 수 있습니다 .

예를 들어 다음 명령 만 입력하고 싶습니다.

ssh qaapps18

그러나 항상 다음 명령과 같이 작동하기를 원합니다.

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'

그래서 이것을 내 ~/.ssh/config파일에 추가했습니다 .

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL

이제이 규칙은 호스트 이름에 “apps”가있는 모든 호스트에 적용됩니다.

자세한 내용은 http://man7.org/linux/man-pages/man5/ssh_config.5.html을 참조하십시오 .


답변

@rogeriopvl의 답변에 추가 한 내용을 바탕으로 다음을 제안합니다.

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

연결 명령 &&은 이전 명령이 성공했을 때만 다음 명령 ;을 실행합니다 (명령을 순차적으로 실행 하는을 사용하는 것과 반대 ). 이것은 특히 필요한 경우에 유용합니다cd 명령을 수행하는 디렉토리에 .

다음을 수행한다고 상상해보십시오.

/home/me$ cd /usr/share/teminal; rm -R *

디렉토리 teminal 가 존재하지 않으므로 홈 디렉토리에 머무르고 다음 명령으로 모든 파일을 제거하십시오.

당신이 사용하는 경우 &&:

/home/me$ cd /usr/share/teminal && rm -R *

디렉토리를 찾지 못하면 명령이 실패합니다.


답변

필자의 경우에는 Jenkins 슬레이브 시스템의 특정 디렉토리 내에서 원격 호스트에서 명령을 실행하고 싶었습니다.

ssh myuser@mydomain
cd /home/myuser/somedir
./commandThatMustBeRunInside_somedir
exit

그러나 내 컴퓨터는 ssh를 수행 할 수 없었으며 (내가 가정 한 의사 tty를 할당 할 수 없었습니다) 다음 오류가 계속 발생했습니다.

Pseudo-terminal will not be allocated because stdin is not a terminal

이 문제를 해결하려면 “cd to dir + my command”를 ssh 명령의 매개 변수로 (의사 터미널을 할당하지 않아도 됨) 전달하고 -T 옵션을 전달하여 ssh 명령에 명시 적으로 지시했습니다. 의사 터미널 할당이 필요하지 않습니다.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"


답변

환경 변수 CDPATH를 사용합니다.