.bashrc를 소싱 한 후 ssh를 사용하여 대화식 쉘에서 명령을 실행하십시오.


11

원격 우분투 컴퓨터에 ssh하고 소스를 제공하고 .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명령이 호출되기 전에 소스를 어떻게 확인할 수 있습니까?


게시물이 혼란 스럽습니다. 그런 명령을 남용하지 않는 것이 좋습니다. 그럼에도 불구하고 bash 또는 bash 명령이 호출되면 .bashrc가 실행되어야한다고 말할 것입니다. 분명히 그런 명령을 실행하는 데 약간의 차이점이나 특성이 있으며 더 심각한 응용 프로그램의 경우 Ansible 또는 꼭두각시를 권장합니다.
Rui F Ribeiro

내 질문을 편집했습니다. 두 번째 명령은 더 단순하고 동일하지만 이전에 .bashrc를 소싱하지 않습니다.
Mehdi

@RuiFRibeiro 학대 ?? 그런 단순한 학대를 어떻게 부를 수 있습니까? ssh를 사용하여 원격 시스템에 로그인 한 후 자동으로 명령을 실행하면 간단합니다. 그렇게 엄청나게 작은 작업을 위해 배치되는 모든 외부 도구는 과잉이 될 것입니다.
Mehdi

1
단지 말하기의 모습은 더 넓은 의미로 사용되도록 의도되지 않았습니다. 필요할 때 사용하십시오. 그러나 사용하는 것만 큼 평화로운 것은 아닙니다. 그럼에도 불구하고 나중에 참조 할 수 있도록 Ansible을 살펴보면 실제로 얼마나 가벼운 지 놀라실 것입니다. 나는 종종 ssh를 통해 명령을 실행합니다.
Rui F Ribeiro

답변:


9

문제는 비 대화식 쉘에서 별명을 실행하려고한다는 것입니다. 당신이 실행하면 ssh user@computer command, command비 대화 형으로 실행됩니다.

비 대화식 쉘은 별명을 읽지 않습니다 (man bash에서).

expand_aliases 쉘 옵션이 shopt를 사용하여 설정되지 않는 한 쉘이 대화식이 아닌 경우 별명은 확장되지 않습니다 (아래 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로그인 쉘이 시작될 때마다 읽을 수 있습니다 (그래서, 당신을 통해 연결할 때마다 ssh예를 들어이), 그 원인이됩니다 my_alias당신이 연결할 때마다 실행되도록.

    기본적으로 로그인 쉘은 읽 ~/.profile거나 ~/.bash_profile무시 ~/.bashrc합니다. Ubuntu와 같은 일부 배포판 (예 : 데비안 및 그 파생어 및 아치) 배포판에는 기본 ~/.profile또는 ~/.bash_profile파일 소스가 ~/.bashrc있으며, 이는 정의 된 별칭 ~/.bashrc이 로그인 쉘에서도 사용 가능 하다는 것을 의미합니다 . 모든 배포판에 해당되는 것은 아니므로 ~/.profile소스를 갖도록 수동으로 편집해야 할 수도 있습니다 ~/.bashrc. 또한 ~/.bash_profile존재 하는 경우 ~/.profilebash에서 무시됩니다.


그렇다면 alias_profile에 별칭을 정의하고 .profile 또는 .bash_profile에서 별칭을 호출하는 것이 좋습니다.
Mehdi

@Mehdi는 당신이하고 싶은 것에 달려 있습니다. Ubuntu 시스템에서는 ~/.basyrc에 의해 자동으로 읽혀 ~./profile지므로에 정의 된 별칭 ~/.bashrc은 모든 쉘에서 읽을 수 ~/.profile있습니다. 이 작업을하려면 실제로 대화식 쉘 ( -i) 을 명시 적으로 시작해야했습니다 .
terdon

5

별명을 사용하지 못하게하고 expand_aliases 명령을 추가하는 .bashrc의 일부를 주석 처리해야했습니다. 이것은 논평되었다

# 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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.