한 줄 질문:배스천 호스트를 통해 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/myhome
ZDOTIDR
/tmp/myhome
HOME
/tmp/myhome
기본적으로 Zsh는 에서 초기화 파일을 검색하며, $ZDOTDIR
설정되지 않은 경우 기본값이 됩니다.$HOME
ZDOTDIR
따라서 다음과 같이 원격 호스트에서 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
또는 직접 로그인했는지 확인할 수 있습니다.