이것은 이 질문에 대한 후속 질문입니다.ssh, 특정 쉘을 시작하고 원격 시스템에서 명령을 실행하시겠습니까?, 에 대해 좀 더 구체적으로 설명하고 ash
ssh 세션에서 셸을 시작할 때 .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
내장 장치에서는 거의 설정되지 않습니다.)
몇 가지 간단한 별칭이나 함수 외에 .bashrc
ash(또는 bash가 아닌 쉘)에서 작동하는 일반적인 항목은 거의 없습니다. 작동하지 않는 것에는 shopt
키 바인딩, 프롬프트 설정, POSIX 이외의 확장을 사용하는 모든 기능, 내장 장치에 존재하지 않는 명령을 참조하는 별칭 등이 포함됩니다.
… ssh -t [email protected] '. /tmp/.bashrc; ash'
/tmp/.bashrc
원래 쉘에서 읽은 다음 다른 쉘 프로그램을 실행하고 있습니다 . 다른 프로그램은 쉘의 내부 설정(예: 별칭)을 상속하지 않습니다. 이는 다음과 관련이 있습니다.ssh, 특정 쉘을 시작하고 원격 시스템에서 명령을 실행하시겠습니까?.profile
환경 변수를 설정하는 읽기에 관한 내용입니다 .예유전학.
$ENV
BusyBox의 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가 존재해야 합니다.