종종 여러 서버 중 하나에 로그인하여 해당 머신의 여러 디렉토리 중 하나로 이동해야합니다. 현재 나는 이런 종류의 것을한다 :
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
의사 터미널 할당을 강제합니다. 이것은 원격 컴퓨터에서 임의의 화면 기반 프로그램을 실행하는 데 사용할 수 있습니다. 예를 들어 메뉴 서비스를 구현할 때 매우 유용합니다.
-t
ssh에 로컬 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 구성 파일에서 RequestTTY
및 RemoteCommand
옵션을 설정할 수 있습니다 .
예를 들어 다음 명령 만 입력하고 싶습니다.
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를 사용합니다.