다른 서버에서 환경 변수 설정 가져오기

다른 서버에서 환경 변수 설정 가져오기

다른 상자의 모든 "env" 변수를 내 로컬 컴퓨터로 가져오고 싶습니다. 환경 변수를 로컬 상자의 env_var.txt에 복사했습니다. 나는 다음을 수행했습니다.

for i in `cat env_var.txt`; do export $i; done

그러나 이것은 모든 환경 변수를 올바르게 설정하지 않는 것 같습니다. 이미 편집했어요

do export $i

입력하다

do echo $i

그리고 변수는 모든 것이 괜찮은 것으로 보입니다. 이 문제의 원인은 무엇입니까? 아니면 모든 환경 변수를 가져오는 다른 방법이 있나요?

답변1

TL,DR: 수출

export -p >env_var.sh

그리고 수입

. env_var.sh

env_var.txt코드가 유효한지 여부는 변수 이름과 값에 있는 서식과 특수 문자(즉, 셸 구문에서 특별한 의미를 갖는 문자)에 따라 달라집니다.

`cat env_var.txt`따옴표 없는 명령 대체입니다. 인용되지 않은 변수 명령 대체에는 "split+glob" 연산자가 적용되어 있습니다. 먼저 명령의 출력을 변수 value 의 문자로 분할한 IFS다음 각 부분을 파일 이름 와일드카드 패턴으로 해석하고 일치하는 각 Patterns 일부 파일을 일치하는 파일로 바꿉니다. 이름. 결과는 for루프가 반복되는 단어 목록입니다.

따옴표가 없는 명령 대체는 사용자가 원하는 경우가 거의 없으며 이 경우에는 확실히 원하는 것이 아닙니다. 그러나 파일 구문이 다음과 같은 경우에는 작동합니다.env 변수 값에 *?\[또는 공백이 포함되어 있지 않습니다..

env_var.txtyes 인 경우 env, 이해되지 않는 구문 분석 방법을 사용하는 대신 실제 구문(줄 바꿈으로 구분된 할당)을 기반으로 구문 분석하면 더 나은 결과를 얻을 수 있습니다. 가장 쉬운 방법인 분할+글로브 연산자를 사용하려면 IFS개행 문자로만 설정하고 와일드카드 일치를 끄세요.

set -f; IFS='
'
export `cat env_var.txt`
set +f; unset IFS

그러나 수신측에서는 해결되지 않는 문제, 즉 출력이 env불분명하다는 문제가 있다. 다음을 고려하면:

foo=bar
hello=world

foo두 개의 변수(하나는 값으로 호출 bar되고 하나는 hello값으로 호출됨) 가 있는지 world, 아니면 하나만 foo값 으로 호출되는지 알 수 없습니다.

bar
hello=world

명시적인 방법으로 환경 변수를 내보내려면사용하지 말고 env대신 export사용하세요. 이 명령은 export -p모든 환경 변수의 값을 셸에서 구문 분석할 수 있는 형식으로 나열합니다. 따라서 수출 측면에서 다음을 실행하십시오.

export -p >env_var.sh

가져오기 측면에서 다음을 실행합니다.

. env_var.sh

경고: Bash에서는 출력을 export -p구문 분석할 수 있지만 bash에서만 가능합니다. 다른 sh 스타일 쉘에서 작동하는 출력을 얻으려면 POSIXLY_CORRECT임의의 값으로 설정하십시오. 이것은 다른 껍질에 해로운 영향을 미치지 않으므로 다음을 수행할 수 있습니다.

(POSIXLY_CORRECT=$POSIXLY_CORRECT; export -p) >env_var.sh

이전 값으로 설정해도 POSIXLY_CORRECT출력에는 아무런 영향이 없습니다. 환경에 있지 않고 실행 후 나타나지 않거나 환경에 있고 해당 값이 변경되지 않습니다. 그러나 이는 bash가 export출력에서 export -p​​bash 특정 구문 대신 이식 가능한 구문을 사용하도록 강제하는 데 충분합니다 declare.

환경 변수를 가져오면 임의 코드가 실행될 수 있으므로 env_var.txt신뢰할 수 있는 소스에서만 가져오거나 가져오십시오. 원인은 env_var.sh코드가 실행된다는 사실이 아니라 환경 변수입니다. 단순히 , , 등과 같은 변수를 가져오는 것만으로도 코드가 추가로 실행될 수 있습니다.. env_var.shPATHLD_PRELOADENV

답변2

bash "source" 명령을 다음과 같이 사용하세요:

source env_var.txt

모든 변수를 가져와야 합니다.

더 많은 정보를 알고 싶다면:https://en.wikipedia.org/wiki/Dot_(명령)

관련 정보