ssh 로그인이 프롬프트에 드롭 된 후 파일을 소싱하십시오.

Aug 16 2020

한 줄짜리 질문 : 배스 천 호스트를 통해 SSH를 통해 로그인 한 후 원격 호스트에서 원격 파일을 자동으로 소싱하려면 어떻게해야합니까?

ssh-ing 후 원격 호스트에서 별칭 목록 + 셸 사용자 정의 함수를 포함하는 파일을 소싱해야합니다.

파일이 / tmp 폴더의 원격 maching에 있습니다 (예 : / tmp / my-rc).

내가 찾은 다른 게시물 및 인터넷 검색

ssh -t [email protected] 'source /tmp/my-rc; bash -l'

문제는 터미널을 얻었지만 새 bash 쉘이기 때문에 별칭이 설정되지 않았다는 것입니다. '

셸이 부착 된 후 소스가 완료되어야한다고 생각하고 아래를 시도했지만 이것도 작동하지 않습니다. 오류가 없습니다. 터미널을 받았지만 파일이 소싱되었다고 생각하지 않습니다 (/ tmp / my-rc 파일에서 더미 메시지를 에코하여 확인 됨).

ssh -t [email protected] 'bash -l; source /tmp/my-rc'

심지어 '.' 소스 대신 운이 없습니다.

어떤 도움.

참고 1 : Bash 또는 ZSH 모든 쉘 솔루션이 수행합니다.

Note2 : actuall ssh는 프록시 명령을 통해 이루어집니다. 즉, 배스 천 호스트를 통한 홉입니다 (관련된 경우에만 언급).

참고 3 : 나는 프로파일 rc 또는 bashrc 또는 원격 호스트의 홈 디렉토리에 대한 권한이 없습니다.

Note4 : 보안 호스트에 로그인 할 때 사용한 정확한 명령은 아래와 같은 배스 천 호스트를 통하는 것입니다.

ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122  

답변

4 StéphaneChazelas Sep 01 2020 at 23:09

을 사용 bash하면 다음을 수행 할 수 있습니다.

ssh -t user@host '
  PROMPT_COMMAND="source /tmp/my-rc
                  unset PROMPT_COMMAND
                 " exec bash --norc'

이는 /tmp/my-rc프롬프트 이전에 소스가되며 PROMPT_COMMAND나중에 설정을 해제하기 때문에 해당 프롬프트 만 발생합니다 .

실제로 정의를 마치면 unset PROMPT_COMMANDif 를 제거하고 싶을 /tmp/my-rc것입니다.

위의 내용은 원격 사용자의 로그인 셸이 Bourne과 유사하다고 가정하지만 대부분의 다른 유형의 셸 (csh / rc / fish)에 적용 할 수 있어야합니다.

2 fra-san Sep 01 2020 at 22:30

원격 호스트에 쓸 수 있다는 점을 감안할 때 , 거기에 디렉토리를 /tmp만들고 /tmp/myhome셸의 프로필과 초기화 파일을 거기에 넣은 다음 Zsh를로 ZDOTIDR설정 /tmp/myhome하고 Bash를로 HOME설정하여 시작할 수 /tmp/myhome있습니다.

기본적으로 Zsh는에서 초기화 파일을 검색하며 설정되지 않은 경우 $ZDOTDIR기본값으로 설정됩니다.$HOMEZDOTDIR

따라서 원격 호스트에서 Zsh를 다음과 같이 시작할 수 있습니다.

ssh -t user@host ZDOTDIR=/tmp/myhome zsh

그리고 Bash는 다음과 같습니다.

ssh -t user@host HOME=/tmp/myhome bash

물론 프로필 / 초기화 파일을 창의적으로 사용할 수 있습니다. 예를 들어 파일을 사용 HOME하여 더 적합한 경로 로 설정 하고 다른 파일을 소싱합니다 (원격 호스트에 이미 도트 파일이있는 경우).

하나의 명령으로 압축 된이 접근 방식의 최소 적용은 다음과 같습니다.

ssh -t user@host 'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

( 이미 존재 mkdir -p ...하는 경우 오류가 표시되는 것을 방지하는 데 사용 합니다 ( /tmp/myhome예 : 원격 호스트에 다시 연결하고 디렉토리가 이미 있음을 알고있는 경우)).

귀하 ProxyCommand를 고려 하면 다음과 같습니다.

ssh -t -o ProxyCommand='ssh -W \
  %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
  10.0.31.122 \
  'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

마지막으로 시도에 대해 : 명령이 대화 형 쉘이 종료 된 후에 만 ​​실행 ssh -t [email protected] 'bash -l; source /tmp/my-rc'되기 때문에 작동하지 않습니다 source.

1 jakethefinn Sep 04 2020 at 19:40

원격 호스트의 sshd_config 파일에서 UsePAMyes 로 설정된 경우 구성 파일 /etc/pam.d/sshd를 사용하면 인증 프로세스의 다른 이벤트 중에서 로그인 성공시 명령 실행을 자동화 할 수 있습니다. 이 코드 줄 추가

session    required     pam_exec.so /etc/myscripts/./sourcing-script

이 선 바로 위에

# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context.  Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open

여기서 / etc / myscripts / sourcing-script는 로그인 성공시 실행할 명령이있는 원격 호스트의 파일입니다.

#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log

이 방법을 사용하여 ssh 세션이 열리기 전에 서비스를 중지하고 로그 파일에보고합니다. 로그 아웃하기 전에 서비스를 시작하도록 crontab을 설정 했으므로 ssh 세션과 병렬로 실행되지 않습니다.

dirkt Aug 16 2020 at 13:40

일반적으로이 작업은 $HOME/.profile또는 변형 에서 수행합니다 .

ssh로 시작하는 환경 변수를 설정합니다.이를 SSH_사용하여를 통해 로그인했는지 ssh또는 직접 로그인했는지 확인할 수 있습니다.