특정 디렉토리로 직접 ssh 할 수 있습니까?


248

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

localhost ~] $ ssh somehost

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

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

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

localhost ~] $ go_to_dir 푸

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

somehost Foo] $

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

답변:


413

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

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

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


설명

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

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

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

21
내 경우에는 -t 잃어버린 부분
Mathieu

2
이 접근법을 사용할 때 .bash_profile을 읽을 수 없습니다.
Filipe

8
나는 이것을해야했다 : ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
guptron

40
당신은 보통 로그인 쉘을 원할 것입니다 :ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy

10
ssh login-Server Fault에서 변경 디렉토리를 자동으로 연결하려고했습니다 . 거기에서이 명령 (@christianbundy의 명령 버전)을 붙여 넣습니다.ssh server -t "cd /my/remote/directory; bash --login"
sdaau

53

추가 할 수 있습니다

cd /some/directory/somewhere/named/Foo

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

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


1
+1, X 머신에 연결할 때 옮길 디렉토리를 ssh 명령보다 길게 기억하는 대신 상수 디렉토리가 필요한 경우 더 적합합니다
Tebe

유연하게 교체 할 때 적절하지 않음
Lewis Chan

21

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

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

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


1
~ / .ssh / config에서 새 구성을 정의하고 거기서 읽을 수 있다면
멋질

21

내가 선호하는 방법은 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을 참조하십시오 .


13

@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 *

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


1
&& 한 번없는 명령으로 작은 따옴표를 사용하고 큰 따옴표는 사용하지 않았으며 엉덩이에서 나에게 물었습니다. 나쁜 교훈은 배웠습니다.
Gavin Pickin

4

필자의 경우에는 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"

3

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


머신 당 하나의 디렉토리에 관심이있는 경우에만 유용합니다. 정보를 원격 컴퓨터에 전달할 수있는 방법이 필요합니다. Roger의 솔루션은 바로 그 일을합니다.
Frosty

2

-t아이디어 로 한 걸음 더 나아갑니다 . 자주 방문하는 호스트의 특정 위치로 이동하기 위해 아래 스크립트를 호출하는 스크립트 세트를 유지합니다. 나는 그것들을 모두 ~/bin보관하고 그 디렉토리를 내 경로에 보관합니다.

#!/bin/bash

# does ssh session switching to particular directory
# $1, hostname from config file 
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c

ssh -t $1 "cd $2; exec \$SHELL --login"

1

로그인 후 바로가는 또 다른 방법은 "Alias"를 만드는 것입니다. 시스템에 로그인 할 때 해당 별칭을 입력하면 해당 디렉토리에있게됩니다.

예 : 별명 = myfolder '/ var / www / Folder'

시스템 유형에 해당 별명 (시스템의 모든 부분에서 작동)에 로그인 한 후
bashrc에없는 경우이 명령은 현재 세션에서 작동합니다. 나중에이 별칭을 bashrc에 추가하여 나중에 사용할 수 있습니다.

$ myfolder => 해당 폴더로 이동


-3

SSH 자체는 통신 수단을 제공하며 디렉토리에 대해서는 아무것도 모릅니다. 실행할 원격 명령 (기본적으로 쉘)을 지정할 수 있으므로 여기서 시작합니다.


4
이것은 해결책이 아닌 부분 답변입니다.
AL

-7

다음 명령으로 집을 간단히 수정하십시오. usermod -d /newhome username


1
조언하지 않습니다. 홈 디렉토리를 변경하면 다른 것들이 깨질 수 있습니다.
bronson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.