`ssh user @ host command`가 작동하도록 $ PATH를 어떻게 설정합니까?


129

를 통해 명령을 실행할 때 사용되도록 새 $ PATH를 설정할 수 없습니다 ssh user@host command. export PATH=$PATH:$HOME/new_path원격 컴퓨터에서 ~ / .bashrc 및 ~ / .profile에 추가 를 시도 했지만 실행 ssh user@host "echo \$PATH"하면 변경 사항이 적용되지 않은 것으로 표시됩니다 (/ usr / local / sbin : / usr / local / bin : / usr / sbin : / usr / bin : / sbin : / bin : / usr / games). 원격 시스템이 Ubuntu 8.04를 실행 중입니다.

나는 그것을 / etc / profile에 해킹 할 수 있다고 확신하지만 깨끗한 솔루션은 아니며 루트 액세스 권한이있는 경우에만 작동합니다.


1
export PATH=$PATH:$HOME/new_path~ / .bash_login 및 ~ / .bash_profile (이전에 시도한 ~ / .bashrc 및 ~ / .profile에 추가) 을 모두 추가 하려고했습니다. 둘 다 작동하지 않습니다. 두 경우 모두 파일을 만들어야했습니다.
Denver Gingerich

내 특정 사용 사례에서 ssh로 전송 된 명령을 수정하는 것은 쉽지 않습니다. stfufs ( guru-group.fi/too/sw/stfufs )를 사용 하여 ssh 명령 자체를 구성합니다. 그 방법이 훌륭한 해결책은 아니지만 stfufs를 수정하지 않고 수정하는 것이 좋습니다.
Denver Gingerich

stfufs 방식으로 ssh 래퍼를 넣을 수 있고, 수정이 쉬운 args로 실제 ssh를 호출 할 수도 있습니다.
Hasturkun

답변:


179

grawity가 말했듯이 ~ / .bashrc는 비 대화식 비 로그인 셸에서 제공되므로 원하는 것입니다.

나는 당신이 가지고있는 문제가 기본 Ubuntu ~ / .bashrc 파일과 관련이 있다고 생각합니다. 일반적으로 다음과 같이 시작됩니다.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

이 줄 앞에 비 대화식 쉘에 대한 내용을 넣고 싶습니다 .


1
그래, 나는 export PATH=$PATH:$HOME/new_path그 선을 그 위로 움직 였고 효과가 있었다. 감사!
Denver Gingerich

3
.bashrc는 신뢰할 수 없습니다. man bash : "Bash는 표준 입력이 네트워크 연결에 연결된 상태에서 언제 실행되고 있는지 확인하려고합니다." 이것은 RHEL에서는 작동하지만 Archlinux에서는 작동하지 않습니다. 기본 경로를 변경하기 위해 / etc / environment를 편집해야했습니다
basin

.zshenvzsh 사용자 에 대한 언급을 추가해야합니다 . 다른 답변에 대한 의견에서 해당 내용을 찾는 데 꽤 시간이 걸렸습니다.
Mike

30

당신은 ~/.bash_login또는~/.bash_profile ?

대화식 모드의 Bash는 이러한 파일을 확인하고 다음 순서대로 기존첫 번째 파일을 사용합니다 .

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

따라서가있는 경우 ~/.bash_profile변경 한 내용 ~/.profile은 보이지 않습니다.

비 대화식 모드의 Bash는 때때로 파일을 읽습니다 ~/.bashrc(이것은 종종 대화식 스크립트에서 소스로 제공됩니다). "때때로"나는 배포에 의존한다는 것을 의미합니다 : 매우 이상하게도 이것을 가능하게하는 컴파일 타임 옵션이 있습니다 . 데비안은 ~/.bashrc읽을 수 있지만 아치는 그렇지 않습니다.

ssh 비 대화식 모드를 사용하는 것 같습니다. 그래서 ~/.bashrc충분합니다. 이와 같은 문제가 발생하면 일반적으로 몇 개의 에코를 추가하여 실행중인 파일을 확인합니다.


에코를 추가하는 것이 도움이되었지만 ... 'ssh -X remotemachine "xterm"'을 실행하고 / etc / profile 및 ~ / home / username / .bash_profile에서 전체 시스템 / 사용자 경로를 유지하는 방법을 계속 찾고 있습니다. 명령에서 두 파일을 모두 소싱하면 작동합니다..하지만 추한 :).
Jess

"비 대화식 모드의 배쉬가 파일을 읽는다는 것을 어떻게 알 수 ~/.bashrc있습니까?" 맨 페이지에이 내용이 표시되지 않습니다. 감사합니다
nknight

4
비 대화식 비 로그인 쉘을 소스로 ~/.bashrc사용하려면 환경 변수를 추가로 설정해야합니다 BASH_ENV. superuser.com/a/585699/100843을 참조하십시오 . 비 대화식 로그인 셸의 경우 언급 한 세 가지 시작 스크립트 중 하나를 수정해야합니다.
nknight

3
ZSH의 경우 비 대화식 파일은 다음과 같습니다..zshenv
math

2
@math .zshenv는 항상 소스입니다. 대화식인지 아닌지는 중요하지 않습니다.
JoL

19

ssh 문서는 말합니다 :

명령이 지정되면 로그인 쉘 대신 원격 호스트에서 실행됩니다.

bashrc 파일에 추가하는 것이 작동하지 않는 이유입니다. 그러나 다음과 같은 옵션이 있습니다.

  1. 경우 PermitUserEnvironment옵션이 SSHD의 설정에 설정되어, 당신은 당신의 PATH 설정을 추가 할 수 있습니다~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'


1. 내 sshd 구성에 설정되어 있지 않으며 man sshd_config기본적으로 해제되어 있으므로이 솔루션이 대부분의 사람들에게 효과가 없을 가능성이 높습니다. 2. 이것은 작동하지만 ssh로 전송 된 명령을 쉽게 수정할 수 없습니다 (내 질문에 대한 두 번째 의견 참조).
Denver Gingerich

1
~ / .ssh / environment에서 $ PATH가 해석되지 않으므로 PATH에 경로를 추가 할 수 없으므로 예상대로 작동하지 않습니다.
not2savvy

8

당신은 항상 말할 수 있습니다 :

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'

이 솔루션은 원격 시스템을 변경할 필요가 없으므로 좋은 방법입니다.
Ronny Andersson

2

@signpolyma 답변 외에도이 줄 앞에 내보내기를 추가해야합니다

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

실제로이 줄을 모두 주석 처리했습니다-Ubuntu 16.04 LTS 데스크탑의 ~ / .bashrc에 있습니다. 모든 것이 작동하지 않습니다. 또한 PermitUserEnvironment를 yes로 설정하십시오.
Ernie S

2

방금 동일한 문제가 발생하여 다음과 같이 해결했습니다.

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.