itsource

특정 디렉토리에 직접 ssh할 수 있는 방법은 무엇입니까?

mycopycode 2023. 5. 7. 11:24
반응형

특정 디렉토리에 직접 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 host
ssh -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

반응형