Bash 스크립트에서 원격 컴퓨터의 환경 변수를 사용하여 원격 컴퓨터에 대한 명령을 어떻게 작성합니까?

Bash 스크립트에서 원격 컴퓨터의 환경 변수를 사용하여 원격 컴퓨터에 대한 명령을 어떻게 작성합니까?

Ubuntu 18에서 bash 스크립트를 작성하려고 합니다. 다음 스크립트가 있습니다 ...

#!/bin/bash -l
  
ssh myuser@remote-machine 'mysql -u $DB_USER --password=$DB_PASS $DB_NAME < /tmp/dump.sql'

이제 내 주요 문제는 bash 스크립트를 실행하는 환경이 아닌 원격 시스템의 환경을 기반으로 환경 변수를 해석하기를 원한다는 것입니다. 지금은 mysql 명령이 현재 환경을 사용하고 있다고 생각합니다. 원격 시스템의 환경에서 환경 변수를 사용하려면 어떤 변경을 해야 합니까?

답변1

귀하의 질문에 대한 의견에서 언급했듯이 (테든,박쉬미), 작은따옴표를 사용하면 명령이 로컬로 확장되지 않습니다.

그러나 인용문으로 인해 원격 환경이 채워지지 않을 수 있습니다 man 1 ssh(굵은 텍스트는 내 것임).

만약주문하다지정되면 원격 호스트에서 실행됩니다.대신에로그인 쉘.

그러나 원격 로그인 셸은 명시적으로 호출될 수 있습니다.

ssh myuser@remote-machine bash -lc \
  "'"'mysql -u "$DB_USER" --password="$DB_PASS" "$DB_NAME" </tmp/dump.sql'"'"

큰따옴표에 유의하세요. 전체 명령이 내부 작은따옴표로 로컬에서 확장되지 않도록 하고, 원격 호스트는 작은따옴표(외부 큰따옴표)로 묶인 명령을 수신하여 Bash에 다음과 같이 전달되기 전에 확장되지 않도록 합니다. 명령 문자열 확장 및 나누기.

또는 추가 인용 없이 ssh표준 입력을 통해 명령을 제공하고 다음을 호출하여 원격 로그인 셸을 얻을 수 있습니다.ssh 아니요명령 매개변수:

echo 'mysql -u "$DB_USER" --password="$DB_PASS" "$DB_NAME" </tmp/dump.sql' |
  ssh -T myuser@remote-machine

-T표준 입력이 터미널이 아닌 경우 할당되지 않은 의사 터미널에 대한 경고를 방지하는 데 사용됩니다.

귀하의 질문은 Bash에 관한 것이므로 추가 편의를 위해 여기서 문자열을 사용할 수도 있습니다.

ssh -T myuser@remote-machine <<<'mysql ...'

필요한 실제 셸 유형은 원격 환경 설정 방법에 따라 다릅니다. 로서비대화형 로그인 셸, Bash는 여러 스크립트를 소스로 제공합니다( /etc/profile존재하는 경우).첫 번째~/.bash_profile, 및 ~/.bash_login사이에 하나가 발견되어 읽을 ~/.profile수 있습니다 ~/.bashrc. ; 필요한 환경 변수를 설정하는 파일을 기반으로 실제 명령을 조정해야 할 수도 있습니다.

관련 정보