ssh, 특정 셸(ash)을 실행하고 원격 시스템에서 환경을 가져옵니다.

ssh, 특정 셸(ash)을 실행하고 원격 시스템에서 환경을 가져옵니다.

이것은 이 질문에 대한 후속 질문입니다.ssh, 특정 쉘을 시작하고 원격 시스템에서 명령을 실행하시겠습니까?, 에 대해 좀 더 구체적으로 설명하고 ashssh 세션에서 셸을 시작할 때 .bashrc 파일을 가져오는 것이 나에게 적합하지 않다는 사실에 중점을 둡니다.

나는 비지박스 버전이 있고 없는 임베디드 Linux 장치를 사용하고 있습니다 sh. ash우리 bash는 공통 사용자 이름( root)과 공통 실행 환경을 공유합니다.

PS1그러나 일부 사용자 정의 별칭과 사용자 정의 프롬프트 string1 변수를 원합니다 .

이것은 일반적인 SSH 세션의 예입니다. sshpass비밀번호를 에 전달 하고 ssh비밀번호를 ~/pw파일에 저장합니다.

기본 셸에는 별칭이 없으며 -sh별칭이 없음을 알 수 있습니다. 기본 PS1프롬프트 문자열에도 경로가 표시되지 않습니다.

$ sshpass -f ~/pw ssh [email protected]
[root@device]$ echo $0
-sh
[root@device]$ alias
[root@device]$ 

장치에는 가 없지만 bash와 분명히 유사한 bash가 있습니다 . ash그래서 ssh를 할 때 쉘로 사용하고 싶습니다. 또한 SSH를 통해 연결하려는 Ubuntu 시스템에 ~/.bashrc있는 Ubuntu의 기본 파일을 복사하고 싶습니다./etc/skel/.bashrc~에서, 그것을 얻을 수 있도록 의 장치에 연결하고 /tmp/.bashrc, 내 ssh 명령이 그렇게 할 수 있기를 원합니다. ~/.bashrc홈 디렉터리가 읽기 전용이므로 원격 장치 에 복사할 수 없습니다 .

다음을 시도했지만 다음 오류가 발생합니다.

주문하다:

sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp/.bashrc \
&& sshpass -f ~/pw ssh -t [email protected] '. /tmp/.bashrc'

결과:

Connection to 192.168.0.2 closed.

SSH 세션이 설정되지 않았습니다.

ash그런 다음 다음 명령을 시도했는데 결과는 다음과 같습니다. 셸에 들어가도 소싱이 작동하지 않는 것을 보여줍니다.

$ sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp/.bashrc \
&& sshpass -f ~/pw ssh -t [email protected] '. /tmp/.bashrc; ash'
~ # echo $0
ash
~ # alias
~ # 

하지만 이제는 . /tmp/.bashrc수동으로 실행할 수 있고 훌륭하게 작동합니다. 유효한 소싱 후에는 향상된 프롬프트 문자열과 새로운 별칭이 있습니다.

~ # . /tmp/.bashrc
ash: /tmp/.bashrc: line 16: shopt: not found
ash: /tmp/.bashrc: line 24: shopt: not found
ash: /tmp/.bashrc: line 111: shopt: not found
root@device:~# alias
l='ls -CF'
alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '"'"'s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'"'"')"'
la='ls -A'
ll='ls -alF'

또한 16, 24, 111행 shopt에서 찾을 수 없기 때문에 재 오류가 표시됩니다. 내가 보내는 .bashrc 파일에서 이를 주석 처리하더라도 위에 표시된 결과는 여전히 동일합니다.

위 명령을 어떻게 작동하게 할 수 있나요? ssh로 접속하고 쉘을 bash와 유사한 것으로 설정한 다음 /tmp/.bashrc내가 scp한 파일을 가져 오길 원합니다 .


유사한 임베디드 장치에서하다일단 bash설치되면 이 cmd는 완벽하게 실행됩니다.내 레포에 문서화한 대로:

sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp \
&& sshpass -f ~/pw ssh -t [email protected] 'bash --rcfile /tmp/.bashrc'

의 경우 bash마지막 bash --rcfile /tmp/.bashrc에 ssh cmd를 사용하는 것이 필요합니다. 그러나 OUT 이 없는 장치에서 이와 유사한 동작을 bash수행하는 데 도움이 필요합니다 .ash

답변1

왜 달렸나요 ash? busybox가 있는 시스템이 두 개의 서로 다른 쉘을 가질 가능성은 거의 없습니다. (기술적으로 이는 /bin/sh와 다를 수 있지만 /bin/ash내장 장치에서는 거의 설정되지 않습니다.)

몇 가지 간단한 별칭이나 함수 외에 .bashrcash(또는 bash가 아닌 쉘)에서 작동하는 일반적인 항목은 거의 없습니다. 작동하지 않는 것에는 shopt키 바인딩, 프롬프트 설정, POSIX 이외의 확장을 사용하는 모든 기능, 내장 장치에 존재하지 않는 명령을 참조하는 별칭 등이 포함됩니다.

… ssh -t [email protected] '. /tmp/.bashrc; ash'

/tmp/.bashrc원래 쉘에서 읽은 다음 다른 쉘 프로그램을 실행하고 있습니다 . 다른 프로그램은 쉘의 내부 설정(예: 별칭)을 상속하지 않습니다. 이는 다음과 관련이 있습니다.ssh, 특정 쉘을 시작하고 원격 시스템에서 명령을 실행하시겠습니까?.profile환경 변수를 설정하는 읽기에 관한 내용입니다 .유전학.

$ENVBusyBox의 Ash 대화형 시작이 시작되면 이름이 있는 파일에서 명령을 읽습니다. (BusyBox의 sh는 ash 또는 hush일 수 있습니다. 명령이 있으므로 귀하의 sh는 ash입니다.) 따라서 명령을 읽으려는 파일의 이름으로 ash설정할 수 있습니다 .ENV

… ssh -t [email protected] 'export ENV=/tmp/.bashrc; sh -i'

답변2

기본 셸은 이 /etc/passwd파일에 저장됩니다. 모든 사용자는 이 chsh명령을 사용하여 기본 셸을 변경할 수 있습니다. 승인된 쉘은 에 나열되어 있습니다 /etc/shells. 물론 이 쉘로 전환하기 전에 bash가 존재해야 합니다.

관련 정보