SSH 로그인 프롬프트 후 파일 얻기

SSH 로그인 프롬프트 후 파일 얻기

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

원격 호스트에 SSH로 접속한 후 원격 호스트의 별칭 + 쉘 사용자 정의 함수 목록이 포함된 파일을 가져와야 합니다.

이 파일은 원격 시스템의 /tmp 폴더에 있습니다(예: /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에 대한 모든 셸 솔루션이 작동합니다.

참고 2: 실제 ssh는 프록시 명령을 통해 이루어집니다. 즉, 요새 호스트를 건너뛰는 것입니다(관련이 있는 경우에만 언급).

참고 3: rc 또는 bashrc 구성 파일에 대한 권한은 물론 원격 호스트의 홈 디렉터리에 대한 권한도 없습니다.

참고 4: 보안 호스트에 로그인하는 데 사용한 정확한 명령은 아래와 같이 배스천 호스트를 통해 이루어졌습니다.

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

답변1

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

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

/tmp/my-rc그러면 나중에 설정을 해제 하므로 프롬프트 전에 소스를 가져오고 프롬프트만 가져 오게 됩니다 PROMPT_COMMAND.

실제로 정의가 완료되면 unset PROMPT_COMMAND제거 해야 합니다 ./tmp/my-rc

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

답변2

원격 호스트에 쓸 수 있다는 점을 고려하면 그 위에 디렉터리를 만들고 거기에 셸의 구성 파일과 초기화 파일을 넣은 다음 Zsh로 설정된 Zsh를 시작 /tmp하고 로 설정된 Bash를 시작할 수 있습니다 ./tmp/myhomeZDOTIDR/tmp/myhomeHOME/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

답변3

만약에PAM 사용로 설정되어 있습니다원격 호스트의 sshd_config 파일에서 구성 파일/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/source-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 세션과 병렬로 실행되지 않습니다.

답변4

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

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

관련 정보