.bashrc를 얻은 후 ssh를 사용하여 대화형 셸에서 명령을 실행합니다.

.bashrc를 얻은 후 ssh를 사용하여 대화형 셸에서 명령을 실행합니다.

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"'

하지만 이는 매우 복잡한 접근 방식인 것 같습니다. 이 작업을 수행해야 하는 이유를 설명하지 않았지만 다음 대안을 고려해보세요.

  1. 원격 시스템에서 일반 로그인 대화형 셸을 시작하고 수동으로 명령을 실행하세요.

    user@local $ ssh user@remote
    user@remote $ my_alias
    
  2. 이 시스템에 연결될 때 별칭이 항상 실행되도록 하려면 원격 시스템 ~/.profile(또는 ~/.bash_profile존재하는 경우)을 편집하고 끝에 다음 줄을 추가하십시오.

    my_alias
    

    로그인 셸이 시작될 때마다(예: 를 통해 연결할 때마다 ) ~/.profile읽기 때문에 연결할 때마다 실행됩니다.sshmy_alias

    기본적으로 로그인 쉘은 이를 읽고 ~/.profile무시 ~/.bash_profile합니다 ~/.bashrc. Ubuntu와 같은 일부 배포판(예: Debian 및 그 파생 배포판, Arch)에는 기본 ~/.profile또는 ~/.bash_profile파일 소스 가 있습니다 ~/.bashrc. 즉, 정의한 별칭을 ~/.bashrc로그인 셸에서도 사용할 수 있습니다. 모든 배포판에 해당되는 것은 아니므로 ~/.profile소스 코드를 수동으로 편집 해야 할 수도 있습니다 ~/.bashrc. 또한 ~/.bash_profile존재 하는 경우 ~/.profilebash에서는 무시됩니다.

답변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"

관련 정보