SSH를 통해 변수가 포함된 로컬 스크립트 파일을 실행할 수 없습니다.

SSH를 통해 변수가 포함된 로컬 스크립트 파일을 실행할 수 없습니다.

원격 시스템에서 실행하려면 다음 스크립트 test.sh 파일을 실행해야 합니다.

변수.txt:

name=stackexchange

테스트.sh:

#!/bin/bash
source ./variables.txt
echo $name

달리기:

ssh -i "auth.key" user@host 'bash -s' < test.sh

하지만 다음 오류가 발생합니다.

bash: line 2: ./variables.txt: No such file or directory

답변1

해당 쉘 ./variables에 존재하지 않는 파일을 가져오도록 다른 시스템의 쉘에 지시합니다 . pwd단계별로 살펴보면 다음과 같습니다.

  1. 이 명령은 ssh를 통해 연결하고 로컬에서 라인을 보냅니다.test.sh

    ssh -i "auth.key" user@host 'bash -s' < test.sh
    
  2. 연결을 통해 원격 셸을 시작 ssh하고 다음 줄을 얻습니다.

    • #!/bin/bash이 행에 대한 원격 쉘의 해석은 쉘이 무엇인지에 따라 다릅니다. 대부분의 쉘은 이 행을 주석으로 처리합니다. 쉘이 이면 sh원격 쉘은 가 되지 않습니다. bash왜냐하면 shebang 라인은 스크립트 파일 내에서만 유효하고 스크립트에는 실행 가능한 비트 세트가 필요하기 때문입니다.
    • source ./variables.txt이제 원격 쉘은 variables.txt현재 작업 디렉토리의 파일에서 데이터를 가져오라는 지시를 받습니다. 파일이 존재하지 않으면 쉘에서 오류가 발생합니다. 귀하의 경우 쉘은 Bash이고 오류는 다음과 같습니다.

      bash: line 2: ./variables.txt: No such file or directory
      
    • echo $name비어 있기 때문에 $name터미널에는 빈 줄만 인쇄됩니다.

variables.txt이를 직접 확인하려면 소스와 다른 행을 사용하여 원격 홈 디렉토리에 파일을 배치하십시오 . 예:

name=remotehost

이전과 같이 테스트 스크립트를 실행합니다.

답변2

원격 컴퓨터에서 실행되는 프로그램은 실행 중인 컴퓨터가 아닌 원격 컴퓨터의 파일을 봅니다 ssh. SSH에 콘텐츠를 test.sh원격 시스템에 복사하고 bash거기에 입력으로 전달하도록 지시하면 실행됩니다 test.sh. 그러나 스크립트(bash가 stdin에서 수신)가 읽으려고 하면 variables.txt실행 중인 시스템에서 해당 내용을 찾습니다. 옵션이 있다는 말은 아니지만) 찾을 수 없었습니다.

스크립트가 너무 복잡하지 않고 중첩된 포함이 없으면 텍스트 대체를 수행하여 스크립트 내용을 인라인할 수 있습니다. 이는 취약하다는 점에 유의하세요. 복잡한 참조, 변수 등이 관련된 source ./variables.txt경우가 아니라 스크립트에 직접 나타날 때만 작동합니다 . 단순화를 위해 해당 명령이 해당 행에 단독으로 존재한다고 eval가정하겠습니다 . source더 복잡한 시나리오를 처리하려면 더 복잡한 변환이 가능합니다.

<test.sh sed '/^[ \t]*source variables\.txt[ \t]*$/ {
  d
  r variables.txt
}' | ssh -i "auth.key" user@host 'bash -s'

관련 정보