SSH를 통해 원격 Ubuntu 시스템에 연결하고 소스를 가져와 .bashrc
해당 시스템에서 설정한 매개변수에 따라 명령을 실행하고 싶습니다 .bashrc
. 이 모든 것은 명령이 완료된 후에도 닫히지 않는 대화형 셸에 있습니다.
내가 지금까지 시도한 것은
ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'
그렇지 않으면
ssh user@remote_computer -t "my_alias;bash"
이는 일반 명령(예 ls
: )에 대해 작동하지만 에 정의된 별칭을 실행하려고 하면 .bashrc
오류가 발생합니다.
bash: my_alias: command not found
하지만 수동으로 다시 작성하고 실행해보니 작동했습니다!
.bashrc
그렇다면 명령을 호출하기 전에 명령의 소스를 어떻게 확인합니까?
답변1
문제는 비대화형 쉘에서 별칭을 실행하려고 한다는 것입니다. 을 실행하면 ssh user@computer command
비대화 command
형으로 실행됩니다.
비대화형 쉘은 (man bash에서) 별칭을 읽지 않습니다.
셸이 비대화형인 경우, Shopt를 사용하여 Expand_aliases 셸 옵션을 설정하지 않으면 별칭은 확장되지 않습니다(아래 SHELL BUILTIN COMMANDS 아래의 shopt 설명 참조).
수동으로 다시 실행하면 마지막 명령이 대화형 셸을 시작하므로 작동하므로 bash
이제 별칭을 사용할 수 있습니다.
대안으로 bash -i
간단한 로그인 셸( ) 대신 원격 시스템에서 대화형 셸( )을 시작하여 별칭을 실행할 수 있습니다.bash -l
ssh user@remote_computer -t 'bash -ic "my_alias;bash"'
하지만 이는 매우 복잡한 접근 방식인 것 같습니다. 이 작업을 수행해야 하는 이유를 설명하지 않았지만 다음 대안을 고려해보세요.
원격 시스템에서 일반 로그인 대화형 셸을 시작하고 수동으로 명령을 실행하세요.
user@local $ ssh user@remote user@remote $ my_alias
이 시스템에 연결될 때 별칭이 항상 실행되도록 하려면 원격 시스템
~/.profile
(또는~/.bash_profile
존재하는 경우)을 편집하고 끝에 다음 줄을 추가하십시오.my_alias
로그인 셸이 시작될 때마다(예: 를 통해 연결할 때마다 )
~/.profile
읽기 때문에 연결할 때마다 실행됩니다.ssh
my_alias
기본적으로 로그인 쉘은 이를 읽고
~/.profile
무시~/.bash_profile
합니다~/.bashrc
. Ubuntu와 같은 일부 배포판(예: Debian 및 그 파생 배포판, Arch)에는 기본~/.profile
또는~/.bash_profile
파일 소스 가 있습니다~/.bashrc
. 즉, 정의한 별칭을~/.bashrc
로그인 셸에서도 사용할 수 있습니다. 모든 배포판에 해당되는 것은 아니므로~/.profile
소스 코드를 수동으로 편집 해야 할 수도 있습니다~/.bashrc
. 또한~/.bash_profile
존재 하는 경우~/.profile
bash에서는 무시됩니다.
답변2
별칭 사용을 방지하는 .bashrc 섹션을 주석 처리하고 Expand_aliases 명령을 추가해야 했습니다. 이 댓글이 달렸습니다
# If not running interactively, don't do anything
#case $- in
# *i*) ;;
# *) return;;
#esac
그리고 이것을 추가했습니다
if [ -z "$PS1" ]; then
shopt -s expand_aliases
fi
그런 다음 내 명령이 작동했습니다.
ssh user@remote_computer -t "my_alias;bash"