경로 변경

경로 변경

사용자가 /bin/bash셸을 가지고 /etc/passwd있고 ssh user@host commandBash를 사용하여 명령을 실행한다고 가정합니다. 그러나 쉘은 로그인할 수도 없고 상호 작용할 수도 없습니다. 즉, 로그인할 수도 없고 소스로 제공할 ~/.bash_profile수도 없음을 의미합니다 ~/.bashrc. 이런 경우 PATH실행파일을 찾아서 실행할 수 있도록 환경변수를 어떻게 설정해야 하나요? 실제 명령 앞에 접두사를 붙이는 것이 좋습니다 source ~/.bashrc?


편집하다. 이 문제는 (사람들이 지적했듯이) Bash에게는 사소한 문제입니다.~/.bashrc 이런 상황에서 비롯됩니다. 최종 답변은 다음 구절에서 나옵니다 man bash.

Bash는 원격 셸 데몬(일반적으로 rshd) 또는 보안 셸 데몬 sshd에 의해 실행되는 경우와 같이 네트워크 연결에 연결된 표준 입력을 사용하여 실행 중인지 확인하려고 시도합니다. bash이 방식으로 실행 중이라고 판단 되면 ~/.bashrc파일이 존재하고 읽을 수 있는 경우 명령을 읽고 실행합니다. 로 호출되면 이 작업을 수행하지 않습니다 sh. 이 --norc옵션을 사용하면 이 동작을 억제할 수 있고, --rcfile다른 파일을 강제로 읽는 데 사용할 수 있습니다. 그러나 rshd나 sshd는 일반적으로 이러한 옵션을 사용하여 셸을 호출하거나 지정을 허용하지 않습니다.

답변1

여러 가지 가능성이 있습니다:

  • PATH서버에서 설정합니다 ~/.ssh/environment( PermitUserEnvironment yes를 통해 활성화 해야 함 sshd_config).
  • 바이너리 파일의 전체 경로를 사용하세요.
  • 언급한 대로 수동으로 source .bashrc: 명령 앞에 . ~/.bashrc( 또는 source) 를 붙입니다.

어느 방향으로 갈 것인지는 사용 사례에 따라 많이 달라집니다.

답변2

당신은 동등하다현지의로 설정외딴설정.

로컬로 현재 실행 중인 셸인 bash 인스턴스에서 다음을 작성할 수 있습니다.

ssh user@host command

ssh 명령은 클라이언트 ssh로 실행됩니다(그 이상은 아닙니다).
이를 위해,현지의주택 요건아니요서브쉘이나 새 쉘을 시작하거나 로그인하십시오.

이 명령의 실행 모드는 ls로컬입니다.

이것은 컴퓨터에 대한 네트워크 연결을 여는 데 사용되는 클라이언트 SSH 명령입니다.외딴시스템이 제대로 인증되면새로운쉘은 ssh 인수로 작성된 명령의 실행을 시작합니다. 인수가 제공되지 않으면 연결에서 더 많은 명령이 실행될 것으로 예상됩니다.

그 새로운 것외딴원격 사용자(시스템)가 로그인하려면 인증이 필요하므로 쉘은 반드시 로그인 쉘입니다. 또는 특정 명령이 제공되면 인증된 사용자 권한으로 해당 명령을 실행하면 됩니다.

$file sourced각 파일의 시작 부분에 를 추가하면 어떤 파일이 어디서 왔는지 확인할 수 있습니다.외딴시스템) ( /etc/파일을 변경하려면 루트가 필요함):

$ a=(~/.bashrc ~/.profile /etc/bash.bashrc /etc/profile)
$ for f in "${a[@]}"; do sed -i '1 i\echo "'"$f"' was read"\n' "$f"; done

그런 다음 SSH 콘솔을 시작합니다.

$ ssh sorontar@localhost
/etc/profile was read
/etc/bash.bashrc was read
/home/sorontar/.profile was read
/home/sorontar/.bashrc was read

이 경우 bashrc두 파일을 읽는 이유는 profile로그인 셸이 파일을 직접 가져오는 것이 아니라 각 파일에 해당 파일을 포함하는 명령이 있기 때문입니다.

$ ssh sorontar@localhost :
/etc/bash.bashrc was read
/home/sorontar/.bashrc was read

이 시스템에서는 bashrc두 경우 모두에서 where 를 읽습니다.

source ~/.bashrc실행할 명령에 a를 추가할 필요가 없습니다 .

경로 변경

/etc/bash.bashrc이 시스템에서 쉘을 실행하는 모든 사용자 에 대한 올바른 설정을 포함하여 "$PATH"를 변경하기만 하면 됩니다 . 또는 ~/.bashrc필요한 모든 사용자에게 적합합니다. 생성된 새 사용자가 올바른 파일을 사용할 수 있도록 .bashrc사용자 의 프레임을 추가(또는 편집)할 수 있습니다 ./etc/skel/

위의 내용은 bash에서만 작동합니다. 이 설정을 모든 셸에 적용해야 하는 경우 SSH 파일을 사용하여 ~/.ssh/environment필요한 각 사용자에 대해 환경 변수 PATH를 설정할 수 있습니다 . 또는 /etc/ssh/sshrcSSH 서버를 실행하는 시스템의 전역 설정의 경우( man sshd자세한 내용은 설명서 섹션을 참조하세요)

답변3

일회성 동작을 원하고 원격 호스트의 SHELL이 bash인 경우 다음과 같이 직접 수행할 수 있습니다.

ssh user@host "PATH=/foo/bar command"

SHELL이 bash가 아닌 경우 다음을 수행할 수 있습니다.

ssh user@host "bash -c 'PATH=/foo/bar command'"

답변4

~/.ssh/rc파일에서 명령을 실행하고 PATH 또는 기타 환경 변수를 설정할 수 있습니다 . ~에서인간 SSH:

~/.ssh/rc

이 파일의 명령은 사용자가 로그인할 때 사용자의 셸(또는 명령)이 시작되기 직전에 ssh에 의해 실행됩니다. 자세한 내용은 sshd(8) 매뉴얼 페이지를 참조하십시오.

SSHD 매뉴얼Login process이는 전체 설명에 명시되어 있습니다:

  1. ~/.ssh/rc가 있으면 실행하고, 그렇지 않으면 /etc/ssh/sshrc가 있으면 실행하고, 그렇지 않으면 xauth를 실행합니다. "rc" 파일에는 X11 인증 프로토콜과 표준 입력 쿠키가 제공됩니다. 아래 SSHRC를 참조하세요.

이 파일의 주요 목적은 사용자의 홈 디렉토리에 액세스하기 전에 필요할 수 있는 초기화 루틴을 실행하는 것입니다. AFS는 이러한 유형의 환경에서 특별한 경우입니다.

이것은 2013 BSD 매뉴얼에서 가져온 것입니다. 최신 2020 Arch Linux BSD 매뉴얼에는 다음과 같은 세부 정보가 나와 있습니다.

  1. ~/.ssh/rc가 존재하고 sshd_config(5) PermitUserRC 옵션이 설정되어 있으면 이를 실행하고, 그렇지 않으면 /etc/ssh/sshrc가 존재하면 이를 실행하고, 그렇지 않으면 xauth를 실행하십시오. "rc" 파일에는 X11 인증 프로토콜과 표준 입력 쿠키가 제공됩니다. 아래 SSHRC를 참조하세요.

~/.ssh/rc어쩌면 이 설정이 나에게 적합하지 않기 때문일 수도 있습니다 .

sshd사용자의 로그인 스크립트가 실행되는 단계를 찾을 수 없습니다 . 어쩌면 ssh 구성 스크립트에 설정되어 있을 수도 있습니다(이 경우 배포판에 따라 다름).

관련 정보