SSH를 통한 sh 시작 파일

SSH를 통한 sh 시작 파일

sh 쉘이 시작되기 전에 몇 가지 중요한 명령을 실행해야 합니다. 이는 ssh host somecommandSSH 명령( ) 및 명령을 실행하는 기타 프로그램 내에서 SSH 명령을 전달하는 데 필요합니다.

내 안에는 .profile이것이 있다:

ihammerhands@wreckcreations:~> cat .profile
#specific environment and startup programs
export PS1="\u@wreckcreations:\w> "
export PYTHONPATH=~/python/lib/python2.4/site-packages
export PATH=$PATH:~/bin:~/python/bin

그러나 이는 실패합니다.

W:\programming\wreckcreations-site\test-hg>ssh name@host echo $PATH
Enter passphrase for key '/home/Owner/.ssh/id_rsa':
/usr/local/bin:/bin:/usr/bin

누락된 PATH 옵션에 유의하세요.

sh 구성 파일의 정확한 이름은 무엇입니까? 참고: 저는 루트 액세스 권한이 없으며 이것이 다른 사용자에게 적용되는 것을 원하지 않습니다. 다른 방법이 있나요?


/bin/sh편집: 에 연결된 것 같습니다 bash. 이는 놀라운 일이 아닙니다. 놀랍게도 내 프로필은 여전히 ​​무시됩니다. 어떤 제안이 있으십니까?

답변1

~/.profile로그인 쉘에 의해서만 실행됩니다. 쉘을 호출하는 프로그램은 쉘이 로그인 쉘인지 여부를 판별합니다( -쉘 호출에서 0번째 인수의 첫 번째 문자로 a를 전달함). 특정 명령을 실행하기 위해 로그인하면 일반적으로 명령이 실행되지 않습니다.

특히 OpenSSH는 명령을 지정하지 않은 경우에만 로그인 셸을 호출합니다. 따라서 명령을 지정하면 ~/.profile읽혀지지 않습니다.

OpenSSH를 사용하면 서버 측에서 환경 변수를 설정할 수 있습니다. 이 기능은 다음에서 활성화되어야 합니다.서버 구성, PermitUserEnvironment지침이 포함되어 있습니다. 변수는 파일에서 설정할 수 있습니다.~/.ssh/environment. 공개 키 인증을 사용한다고 가정하면 다음에서 각 키 변수를 설정할 수도 있습니다.~/.ssh/authorized_keysenvironment="FOO=bar": 해당 줄의 시작 부분에 추가됩니다 .

SSH는 환경 변수 전송도 지원합니다. OpenSSH에서 다음 SendEnv명령을 사용하십시오.~/.ssh/config. 그러나 특정 환경 변수는 서버 구성의 지시문을 사용하여 활성화해야 하므로 AcceptEnv이것이 작동하지 않을 수 있습니다.

공개 키 인증을 사용하는 한 항상 (이상하게) 작동하는 한 가지는 다음과 같습니다.(ab) 파일 command=의 옵션 사용authorized_keys. 옵션이 있는 키는 command지정된 명령을 실행하는 데에만 적용됩니다. 그러나 파일의 명령은 사용자가 지정한 명령으로 설정된 authorized_keys환경 변수로 실행됩니다 . SSH_ORIGINAL_COMMAND사용자가 명령을 지정하지 않아 대화형 쉘이 필요한 경우 이 변수는 비어 있습니다. 따라서 다음과 같은 것을 사용할 수 있습니다 ~/.ssh/authorized_keys(물론 인증에 이 키를 사용하지 않으면 작동하지 않습니다).

command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …

또 다른 가능성은 서버에 래퍼 스크립트를 작성하는 것입니다. 다음과 비슷한 것 ~/bin/ssh-wrapper:

#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"

rsync그런 다음 등의 스크립트에 대한 심볼릭 링크를 만듭니다 . 명령줄에서 전달되며 unison다른 프로그램에서도 마찬가지입니다. 또는 일부 명령을 사용하면 원격으로 실행할 전체 셸 조각을 지정할 수 있으므로 명령을 독립형으로 만들 수 있습니다. 예를 들어 rsync의 경우 .--rsync-path='bin/rsync'rsync--rsync-path='. ~/.profile; rsync'

로그인 쉘이 bash인지 zsh인지에 따라 다른 방법이 있습니다. Bash는 ~/.bashrc대화형이 아니더라도 rshd 또는 sshd에 의해 호출될 때 항상 읽습니다(그러나 로 호출되는 경우에는 읽지 않음 sh). Zsh는 항상 ~/.zshenv.

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login shell, but this is an rsh/ssh session
  . ~/.profile
fi

답변2

귀하의 질문에서 언급한 명령은 주목할 가치가 있는 것 같습니다.

ssh name@host echo $PATH

거의 유용하지 않습니다. $PATH의 변수 대체는 로컬 쉘에 의해 수행되고 ssh로 전달됩니다. SSH는 원격 시스템에서 에코를 수행하여 로컬 시스템에서 확장된 경로 변수의 내용을 인쇄합니다. 다음은 Mac과 네트워크의 Linux 시스템 간에 유사한 작업을 수행하는 방법에 대한 예입니다.

LibMBP:~ will$ echo $PATH
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren echo $PATH
will@warren's password: 
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren 'echo $PATH'
will@warren's password: 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LibMBP:~ will$ 

로컬 셸이 변수를 확장하지 못하도록 따옴표를 어떻게 사용해야 하는지 참고하세요.

답변3

일반적으로 로그인 시 bash는 다음에서 명령을 읽습니다.

~/.bash_profile
~/.bashrc

Bash 매뉴얼 페이지에서:

~/.bash_profile
로그인 쉘에 의해 실행되는 개인 초기화 파일

~/.bashrc
각 대화형 셸에 대한 별도의 시작 파일

답변4

(삭제되었습니다... 신규사용자는 하이퍼링크를 1개만 가질 수 있습니다~)

고쳐 쓰다

죄송합니다. 비대화형 세션에 관한 내용인 줄은 몰랐습니다. 해당 세션에서는 위 링크가 작동하지 않습니다.

Bash가 SH 호환 모드에서 시작되면 POSIX® 표준을 준수하면서 sh의 이전 버전의 시작 동작을 최대한 가깝게 모방하려고 시도합니다. 로그인 셸인 경우 읽은 구성 파일은 /etc/profile 및 ~/.profile입니다.

로그인 셸이 아닌 경우 환경 변수 ENV가 평가되고 결과 파일 이름이 시작 파일 이름으로 사용됩니다.

시작 파일을 읽은 후 Bash는 POSIX(r) 호환 모드로 들어갑니다(시작이 아닌 실행용!).

Bash는 다음 조건에서 sh 호환 모드로 시작됩니다.

  • argv[0]의 기본 파일 이름은 sh입니다(:!: 친애하는 슈퍼 스마트 Linux 사용자 여러분, 참고하시기 바랍니다... /bin/sh는 /bin/bash에 연결될 수 있지만 이것이 /bin/bash처럼 동작한다는 의미는 아닙니다. :!:)

따라서 문제는 쉘이 이렇게 시작되었음에도 불구하고 왜 실행하지 않는가 하는 것입니다.

원천

관련 정보