특정 디렉토리에 직접 ssh할 수 있는 방법은 무엇입니까?
종종 여러 서버 중 하나에 로그인하고 해당 시스템의 여러 디렉터리 중 하나로 이동해야 합니다.현재 저는 다음과 같은 일을 하고 있습니다.
localhost ~]$ ssh 일부 호스트 호스트에 오신 것을 환영합니다! somehost ~]$ cd /some/directory/somewhere/named/Foo일부 호스트 Foo]$
어떤 호스트와 어떤 디렉토리에 액세스해야 하는지 결정할 수 있는 스크립트가 있지만 이를 수행할 방법을 찾을 수 없습니다.
localhost ~]$ go_to_dir Foo 호스트에 오신 것을 환영합니다! 일부 호스트 Foo]$
이것을 할 수 있는 쉬운 방법, 영리한 방법, 또는 어떤 방법이 있습니까?
다음 작업을 수행할 수 있습니다.
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash --login"
이렇게 하면_wanted 디렉토리에서 바로 로그인 셸을 얻을 수 있습니다.
설명.
-t
유사 터미널 할당을 강제로 적용합니다.이것은 원격 컴퓨터에서 임의의 화면 기반 프로그램을 실행하는 데 사용될 수 있으며, 이는 메뉴 서비스를 구현할 때 매우 유용할 수 있습니다.중
-t
옵션은 ssh에 로컬 tty가 없는 경우에도 tty 할당을 강제합니다.
- 당신이 않경지는우를 사용하지
-t
그러면 프롬프트가 나타나지 않습니다. - 추가하지 않을 경우
; bash
권한이 됩니다. - 추가하지 않을 경우
bash --login
.
추가할 수 있습니다.
cd /some/directory/somewhere/named/Foo
의 신에게에..bashrc
파또일 (는▁file.profile
또는 뭐라고 부르든지) 다른 호스트에서., , 서 하든, 무하식을든로, 어서하든엇으.ssh
해당 서버에 로그온할 때마다 다음과 같이 표시됩니다.cd
사용자에게 적합한 디렉토리로 이동하고 사용하기만 하면 됩니다.ssh
여느 때와 마찬가지로
물론, rogeriopl의 해결책도 효과가 있지만, 조금 더 장황하고, 매번 해야 한다는 것을 기억해야 합니다(익명을 만들지 않는 한). 그래서 약간 덜 "재미" 있는 것 같습니다.
제가 선호하는 접근 방식은 SSH 구성 파일(아래 설명)을 사용하는 것이지만, 사용 용도에 따라 몇 가지 가능한 해결 방법이 있습니다.
명령줄 인수
저는 이 접근법에 대한 가장 좋은 답변은 수용된 답변에 대한 크리스찬 번디의 답변이라고 생각합니다.
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
원격 시스템의 변수:
sshcd example.com \$JBOSS_HOME
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 를 참조하십시오.
저는 SSH와 CD를 서버에 연속적으로 저장할 수 있는 도구를 만들었습니다. 적절한 이름은 sshcd입니다.예를 들어 다음과 같이 간단히 설명할 수 있습니다.
sshcd somehost:/some/directory/somewhere/named/Foo
궁금한 점이나 문제가 있으면 알려주세요!
@rogeriopl의 답변에 추가된 내용을 바탕으로 다음을 제안합니다.
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를 사용합니다.
한 걸음 더 나아가서는-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"
제 대답은 당신이 정말 원하는 것과 다를 수도 있지만, 몇몇 사람들에게 유용할 수도 있기 때문에 여기에 글을 씁니다.내 솔루션에서는 디렉터리에 한 번 입력한 다음 모든 새 ssh 세션이 동일한 dir(첫 번째 로그아웃 후)로 이동해야 합니다.
마지막 로그인에서 사용한 것과 동일한 디렉토리에 SSH하는 방법.(원격 노드에서 bash를 사용한다고 가정합니다.)
원격 노드(!)의 ~/.bash_logout에 이 행을 추가합니다.
echo $PWD > ~/.bash_lastpwd
~/.svrc 파일에 대한 이러한 행(아직 원격 노드에 있음!)
if [ -f ~/.bash_lastpwd ]; then
cd $(cat ~/.bash_lastpwd)
fi
할 수 "" "" "" "" " "" " " " " " " " " " " " 입니다..bashrc
로그인 후 해당 디렉토리로 이동합니다.
ps: 사용하는 것처럼 더 조정할 수 있습니다.SSH_CLIENT
로컬 로그인과 ssh 또는 서로 다른 ssh 클라이언트 간에 구별할 수 있도록 해당 디렉토리로 이동할지 여부를 결정하는 변수입니다.
로그인 후 바로 이동할 수 있는 또 다른 방법은 "Alias"를 만드는 것입니다.시스템에 로그인할 때 해당 별칭을 입력하기만 하면 해당 디렉터리에 있게 됩니다.
예: 별칭 = myfolder '/var/www/Folder'
시스템 유형에 로그인한 후 해당 별칭(시스템의 모든 부분에서 작동)
이 은 현재합니다. "rc" 명령어는 과 같습니다. 이 할 수도 .
내 폴더 => 그 폴더로 이동합니다.
오래 전에 답변을 드린 것으로 알고 있습니다만, bash 스크립트에 ssh 로그인을 통합하고 로그인한 후 몇 가지 명령을 실행하고 다시 로그아웃하여 bash 스크립트를 계속 진행하는 동안 문제를 발견했습니다.제가 찾은 가장 간단한 방법은 이것을 하는 것입니다. 왜냐하면 그것은 매우 사소한 것이기 때문입니다.
#!/bin/bash
sshpass -p "password" ssh user@server 'cd /path/to/dir;somecommand;someothercommand;exit;'
사용자와 연결
In case if you don't know this, you can use this to connect by specifying both user and hostssh -t <user>@<Host domain / IP> "cd /path/to/directory; bash --login"
예:ssh -t admin@test.com "cd public_html; bash --login"
할 수 있습니다.;
아쉽게도 여러 홉을 사용할 때 (@rogeriopl의) 제안된 솔루션이 작동하지 않아서 다른 솔루션을 찾았습니다.에서 에 합니다.~/.bashrc
다음 항목:
[ "x$CDTO" != "x" ] && cd $CDTO
이렇게 하면 다음과 같은 방법으로 명령줄에서 원하는 대상 디렉터리를 지정할 수 있습니다.
ssh -t host1 ssh -t host2 "CDTO=/desired_directory exec bash --login"
물론입니다, 이 방법은 싱글 홉에도 사용할 수 있습니다.
이 솔루션을 @redseven의 유용한 팁과 결합하여 유연성을 높일 수 있습니다($CDTO가 없으면 저장된 디렉토리로 이동합니다).
SSH 자체는 통신 수단을 제공하며 디렉토리에 대해 아무것도 알지 못합니다.어떤 원격 명령을 실행할지 지정할 수 있으므로(기본적으로 - 사용자의 셸), 여기서 시작하겠습니다.
수정합니다.usermod -d /newhome username
언급URL : https://stackoverflow.com/questions/626533/how-can-i-ssh-directly-to-a-particular-directory
'itsource' 카테고리의 다른 글
라이브러리 추가/J이클립스 안드로이드 프로젝트의 AR (0) | 2023.05.07 |
---|---|
회사 이름은 어디에 설정합니까? (0) | 2023.05.07 |
pyvenv-3.4가 0이 아닌 종료 상태 1을 반환했습니다. (0) | 2023.05.07 |
bash의 별칭에 인수 전달 (0) | 2023.05.07 |
Windows에서 디렉터리/폴더의 트리 보기? (0) | 2023.05.07 |