원격 시스템에서 실행하려면 다음 스크립트 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
단계별로 살펴보면 다음과 같습니다.
이 명령은 ssh를 통해 연결하고 로컬에서 라인을 보냅니다.
test.sh
ssh -i "auth.key" user@host 'bash -s' < test.sh
연결을 통해 원격 셸을 시작
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'