대화식 모드로 전환하기 전에 ssh 세션을 시작할 때 일부 명령을 실행할 수 있습니까? 기본 대화

ssh 명령으로 ssh 세션을 시작할 때 기본 env를 사용하는 기본 대화 형 세션과 홈 디렉토리에서 시작하는 두 가지 옵션이 있거나 임의의 명령을 실행하지만 비 대화식으로 실행하는 ssh "command; command; bash -i -l"것처럼 보입니다 (심지어도 좋지 않은 것처럼 보입니다). 나는 종종 대화식 세션을 원하지만 그 전에는 일반적으로 디렉토리 변경 또는 시스템 환경 조정과 같은 일이 발생합니다. 이러한 것들은 세션마다 다를 수 있으므로, 나는 단지 그것들을 붙일 수는 없습니다 .bashrc.

그렇게 할 수있는 방법이 있습니까?



답변

나는 마침내 비밀을 알게 되었기 때문에 스스로 대답하고 있습니다. 둘 -t에 대한 옵션 ssh, 나 -l에 대한 옵션을 bash하지만 그들은 작동 조합 – 자신에 로그인 쉘로 이어질 것입니다.

ssh user@host.com -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'디렉토리 설정 환경 변수를 변경 한 다음 적절한 로그인 쉘 (즉, 내가 지금까지 발견 한 유일한 차이점 시작 /etc/motd정상적으로입니다 – 이런 식으로 표시되지 않습니다 ssh의 또는 login의 책임,하지 bash의 – 모든 것이 아닌 것 같습니다 완벽하게 작동하고 모든 환경 변수는 동일합니다).

그들은 제한하지 않는 때문에 이러한 환경 / 디렉토리 변경, SSH 후 발생 PermitUserEnvironment과 관련된 설정을 (정확히 같은 계획)하지만 전 .bashrc/ .profile실행하세요. 여기에는 장점과 단점이 있습니다. bash init 스크립트에서 설정 한 내용을 무시하는 것이 더 어렵지만 PS1, 올바른 값을 ssh명령 행에 정확하게 패킹하기가 쉬우 며 .profile모든 노력 이 필요합니다.

실제로 필요한 경우 bash .profile가 명령 줄 을 사용하여 무언가를 실행하는 것은 실제로 매우 쉽습니다. ssh user@foo.com -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'그런 식으로 넣을 때 매우 추악하지만 이러한 대체 .profile파일은 이전에 준비 할 수 있습니다. (내가 알 수 bash있는 한 .profile스크립트에 대한 후보 위치가 몇 개 있고 처음 발견 된 위치를 실행합니다- . file자동 폴 백이 없으므로 profile원하는 경우 정상적인 위치를 확인 해야합니다)


답변

.bashrc를 편집하고 SSH 관련 환경 설정을 다음으로 묶으십시오.

if [ $SSH_TTY ]; then
    ...
fi

이를 통해 SSH 세션에 대한 설정을 추가 할 수 있습니다. ‘코스, 당신이 원하는 모든 것이 세션마다 다른 임의의 환경 변수를 처음부터 바로 설정하는 것이라면, 나는 당신이 기계를 입력하는 것 외에도 당신을 위해 추측 할 수있는 방법을 모르겠습니다 … 설정 선택을 기반으로 테스트 할 수있는 조건이 필요합니다.


답변

로부터 ssh매뉴얼 페이지

또한 ssh는 ~ / .ssh / environment를 읽고 파일이 존재하고 사용자가 환경을 변경할 수있는 경우“VARNAME = value”형식의 행을 환경에 추가합니다. 자세한 내용은 sshd_config (5)의 PermitUserEnvironment 옵션을 참조하십시오.

그것은 말합니다 :

허가 사용자 환경
~ / .ssh / authorized_keys의 ~ / .ssh / environment 및 environment = 옵션이 sshd (8)에 의해 처리되는지 여부를 지정합니다. 기본값은 “아니오”입니다. 환경 처리를 활성화하면 LD_PRELOAD와 같은 메커니즘을 사용하여 일부 구성에서 액세스 제한을 무시할 수 있습니다.

이 기능은 Mickey가 제안한 구조를 ~/.bashrc사용 하여 원격에서 명령문을 조건부로 실행하는 데 사용될 수 있습니다 .if


답변

다음과 같이 간단하게 실행하십시오. ssh -t yourdomain 'cd /yourpath; bash'

  • -t : 프롬프트가 표시되도록
  • ; bash: 명령을 실행하고 cdssh 세션을 종료 하더라도 컨트롤을 다시 반환합니다.