ssh, 특정 쉘을 시작하고 원격 시스템에서 명령을 실행합니까?


11

여러 사용자가 원격 컴퓨터에서 동일한 사용자 계정을 공유하는 상황에 있습니다. 내 .zshrc파일을 작성한 "개인"디렉토리가 있으며 다음 과 같은 방법을 원합니다.

  1. 내 SSH 설정 파일에서 지시어로 (예를 원격 시스템에 SSH 세션을 시작합니다 ControlMaster auto)
  2. 이 세션은 Z 쉘을 실행합니다
  3. 그것은 실행 .zshrc내 "개인"디렉토리 (안 공유 사용자의 홈 디렉토리에)

별명이나 그러한 ssh 세션을 시작하는 간단한 방법을 사용하는 것이 좋을 것입니다 (그래서 OpenSSH의 구성 파일 사용에 대해 생각한 이유입니다).

OpenSSH의 설정 파일을 사용하십니까?

OpenSSH의 ssh_config 매뉴얼 페이지 에서 지시문 LocalCommand을 사용 하여 서버에 성공적으로 연결 한 후 로컬 로 실행할 명령을 지정할 수 있다는 내용을 읽었습니다 . 이것은 서버에 연결 한 후 원격으로config 실행할 명령을 파일 에 알려주는 방법이 있다고 생각 했지만 아무 것도없는 것 같습니다.


나는 당신이 할 수 있다고 생각하지 않습니다. 그러나 나는 당신이 왜 이것을 원하는지 의아해합니다. ssh 명령 행에 이미 명령이 있습니다. 왜 달릴 수 ssh mycommand없습니까? 그리고 ssh에서 오는 모든 명령 전에 setup 명령을 실행하려면 서버 측을 구성하지 않는 이유는 무엇입니까?
Gilles 'SO- 악마 그만'

감사합니다 @Guilles. 여러 사용자가 동일한 원격 계정을 공유하는 상황에 있으므로 원격으로 로그인 할 때 몇 가지 사항을 빠르게 설정하고 싶습니다. 보다 구체적으로, Z 쉘을 시작 .zshrc하고 특정 디렉토리 (예 : "개인"홈 디렉토리)에서 실행하도록 요청하고 싶습니다 . 나는 시도 ssh -t host_name 'zsh & source /path/to/my_zshrc'(내가 가진하지만 일을하지 않았다 FPATH variable not defined, 내가 있기 때문에 생각 zsh이 실행되기 전에 완료는 my_zshrc, 말할 것도이 나에게 Z 쉘을 포기하지 않았다)
아멜리오 바스케스 - 레이나

OP의 업데이트가 필요하다고 생각했기 때문에 방금 업데이트했습니다.
Amelio Vazquez-Reina

내 비슷한 대답을 찾은 후에이 질문 이 당신이하려는 일에 매우 가깝다는 것이 나에게 발생합니다 .
Gilles 'SO- 악의를 멈춰라'

답변:


15

명령을 원격으로 실행하는 가장 확실한 방법은 ssh 명령 행에서 지정하는 것입니다. ssh 명령은 항상 원격 사용자의 쉘에 의해 해석됩니다.

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'

공유 계정은 일반적으로 나쁜 생각입니다. 가능하다면 모든 사용자에 대해 별도의 계정을 만드십시오. 공유 계정이 붙어 있다면 별명을 만들 수 있습니다.

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'

공개 키 인증 (다시 권장)을 사용하는 경우에서 키별 명령을 정의 할 수 있습니다 ~/.ssh/authorized_keys. 자세한 설명 은 이 답변 을 참조하십시오 . ~/.ssh/authorized_keys서버 에서 키 라인을 편집하십시오 (모두 한 줄에).

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== bob@some.where

환상적인 @Guilles. 이 사이트에 대한 귀하의 기여는 우리 모두에게 매우 유용한 자료가되고 있습니다. 정말 고마워요 그건 그렇고, 나는 exec명령 에 대해 몰랐습니다 . 직접 exec zsh전화 하는 것과 다른 점은 zsh무엇입니까? 이 특별한 경우에 왜 중요한가?
Amelio Vazquez-Reina

흠, 내가 달릴 때 나는 ssh -t shared-account@example.com 'HOME=~/bob; exec zsh'얻는다 HOME=~/bob: command not found. 나는 지금 생각합니다 tcsh. 시도하면 같은 문제가 발생합니다 HOME=/home/bob. 나는 bash와 zsh를 시도했다. 어떤 원인이 원인 일 수 있습니까? 마지막으로 위의 구문으로 ssh 세션을 열어 두었습니까? (내가 원하는 것). 다시 감사합니다.
Amelio Vazquez-Reina

1
@intrpc exec는 원래 쉘을 zsh로 바꿉니다. 가 없으면 zshzsh가 종료 된 다음 종료 될 때까지 원래 쉘이 메모리에 남아 있습니다. 주요 차이점은 약간의 메모리를 절약한다는 것입니다. 그리 중요하지 않습니다. 로그인 쉘이 (t) csh 인 경우을 사용하십시오 setenv HOME ~/bob; exec zsh. 마지막으로 zsh는 인수없이 시작되므로 방금 실행 ssh하여 zsh를 로그인 쉘로 사용 했을 때와 같은 쉘 세션을 얻게됩니다 .
Gilles 'SO- 악마 그만해'

도와 주셔서 감사합니다. 하나의 후속 질문이 있습니다. 명령 후에 더 많은 명령을 실행할 수있는 방법이 exec zsh있습니까?
Amelio Vazquez-Reina

1
@ AmelioVazquez-Reina 도트 파일 중 하나를 제어 할 수 없다면 편리하지 않습니다. ZDOTDIRzsh가 다른 디렉토리에서 도트 파일을 찾도록 환경 변수 를 설정할 수 있습니다 . 이 점 파일을 일부 제어를 할 경우에 당신은 추가 같은 것을 할 수있는 eval $LC_STARTUP_CODE대상을 $ZDOTDIR/.zshrc환경 변수에 실행하는 코드를 전달합니다 LC_STARTUP_CODE.
Gilles 'SO- 악마 그만해

-3

서버를 연결 한 후 원격으로 명령을 실행하려면 .ssh / config 파일에 다음 스 니펫을 추가하십시오.

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*

2
@ user626129에게 감사하지만, 원래 질문에서 언급했듯이 LocalCommand지시문은 원격 쉘이 아닌 로컬 쉘에서 명령을 실행하는 것 입니다.
Amelio Vazquez-Reina
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.