~/.profile
로그인 쉘에 의해서만 실행됩니다. 쉘을 호출하는 프로그램은 쉘이 로그인 쉘이 될지 여부를 결정합니다 ( -
쉘 호출에서 0 번째 인수의 첫 번째 문자로). 특정 명령을 실행하기 위해 로그인 할 때는 일반적으로 실행되지 않습니다.
특히 OpenSSH는 명령을 지정하지 않은 경우에만 로그인 쉘을 호출합니다. 따라서 명령을 지정하면 ~/.profile
읽을 수 없습니다.
OpenSSH를 사용하면 서버 측에서 환경 변수를 설정할 수 있습니다. 지시문 과 함께 서버 구성 에서 활성화해야합니다 PermitUserEnvironment
. 변수는 파일에서 설정할 수 있습니다 ~/.ssh/environment
. 공개 키 인증을 사용한다고 가정하면 관련 행의 시작 부분 에 ~/.ssh/authorized_keys
: 키를 추가 할 수 있습니다 environment="FOO=bar"
.
Ssh는 환경 변수 전송도 지원합니다. OpenSSH에서의 SendEnv
지시문을 사용하십시오 ~/.ssh/config
. 그러나 특정 환경 변수는 AcceptEnv
서버 구성에서 지시문 으로 활성화해야 하므로 제대로 작동하지 않을 수 있습니다.
공개 키 인증을 사용하는 한 항상 (이상하게도) 효과가 있다고 생각 되는 것은 파일 의 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-path='bin/rsync'
상의 rsync
명령 행 등 다른 프로그램에. 또는 일부 명령을 사용하면 원격으로 실행할 전체 셸 스 니펫을 지정할 수 있으므로 명령을 독립적으로 만들 수 있습니다 --rsync-path='. ~/.profile; rsync'
. 예를 들어 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