session_secret을 변경하기 위해 자주 설정하려고 합니다 ENV variable
. and 를 crontab
사용하면 그들이 사용하는 샌드박스 환경을 없앨 수 없는 것 같습니다. 너무 많은 문자에 대해 이 변수를 무작위로 생성된 값 으로 설정해야 합니다 .ruby
bash
hex
가능합니까? 현재 인스턴스 값을 변경할 수 없는 것 같습니다.
MYVAR=$(openssl rand -hex 32)
이는 스크립트에 있지만 bash
내 사용자로 확인할 때 변경되지 않습니다. 내가 뭘 잘못하고 있는지 잘 모르겠습니다.
답변1
잘못된 결론 - 프로세스 외부에서 프로세스 환경을 변경하는 능력입니다.
스크립트 를 실행한다고 가정해 보겠습니다 ruby
.
그러면 환경 변수가 있는 bash 쉘 인스턴스가 시작됩니다. 여기서 Ruby 인터프리터는 현재 bash 쉘 인스턴스 환경을 상속하기 시작하고 인터프리터와 관련된 몇 가지 새로운 환경 변수를 추가할 수 있습니다.
실행 중인 모든 프로그램에는 process id
aka 가 있습니다 pid
. 프로세스 환경은 /proc/<pid>/environ
여기에 저장되며 읽기 전용이며 외부에서 변경할 수 없습니다. 여기서 지적한 대로실행 중인 프로세스의 환경 변경
Ruby 스크립트가 실행되면 상위 bash 인스턴스도 실행됩니다. 이 bash 예제는 다음과 같습니다.변경된 환경 변수를 읽지 않음그리고는상속되거나 전달되지 않음하위 항목에 대한 새 변수:
$ pstree -p | grep ruby
bash(1234)---ruby(5678)
grep을 사용하여 env.vars를 찾을 수 있습니다.
xargs -n 1 -0 < /proc/5678/environ | grep MYVAR
스크립트가 실행되는 동안 새로 변경된 환경 변수를 가져오는 유일한 방법은 새 bash/ruby 인스턴스를 시작하고 이전 인스턴스를 종료하는 것입니다.
가능한 잘못된 결론 - 스크립트는 env에서 지속적으로 읽습니다. - env가 변경될 때 스크립트에 알림이 전달됩니다. - env는 인터프리터에 의해 캐시되지 않습니다.
일반적으로 스크립트는 처음에 환경 변수를 읽습니다. 스크립트를 시작할 때만, 런타임에는 env_vars 대신 내부 변수를 계속 사용합니다. 프로세스 환경이 외부에서 변경될 수 있고 스크립트가 지속적으로 환경 변수를 읽는 경우에도 환경은 실제 환경이 아닌 캐시된 복사본일 수 있습니다.
(파이썬 예)
# start
key = os.environ.get('MYVAR')
# do something with key until scripts ends
답변:
- Ruby 스크립트를 수정하고
openssl rand -hex 32
정기적으로 실행하여 결과를 변수로 읽어옵니다. /path/data
cron이 생성한 변수에 파일을 읽어와서openssl rand -hex 32
수시로 출력하도록 Ruby 스크립트를 수정합니다 .- cronjob은 새 환경을 사용하여 스크립트를 다시 시작합니다. (즉,
sudo # see switches -i -u and --)
주석에서 언급했듯이 사용자 범위 환경은 profile.d에서 설정할 수 있습니다.etc-profile-d-의 스크립트가 수행하는 작업