원격 SSH 출력이 "echo $SHELL"을 캡처하지 않는 이유는 무엇입니까?

원격 SSH 출력이 "echo $SHELL"을 캡처하지 않는 이유는 무엇입니까?

bash에서든 Python에서든 cat을 사용하여 원격 SSH 호출의 출력을 캡처하면 모든 것이 예상대로 작동합니다.

예를 들어 다음은 잘 작동합니다.

import subprocess
rc = subprocess.getoutput(“ssh user@host; cat /proc/meminfo”)
print(rc)
>> MemTotal:        2048212 kB
MemFree:          202168 kB
MemAvailable:    1578308 kB
Buffers:          240876 kB
Cached:          1073456 kB
SwapCached:            0 kB
Active:          1049444 kB
…etc

그러나 결과가 생성되지 않습니다.

import subprocess 
rc = subprocess.getoutput(“ssh user@host; echo $SHELL”)
>>

동일한 사용자로 SSH를 통해 시스템에 연결하고 "echo $SHELL"을 입력해도 작동하고 stdout으로 출력됩니다.

내가 여기서 무엇을 놓치고 있는 걸까요?

내 메모에는 다음과 같은 의견이 있습니다.

쉘 스크립트에서 로컬 환경 변수를 사용할 수 있게 하려면 exec 명령을 사용하여 스크립트를 시작하십시오.

명령 프롬프트에서 직접 스크립트를 실행하면 스크립트에 대한 새 하위 셸이 생성되어 셸의 모든 로컬 환경 변수를 스크립트에서 사용할 수 없게 됩니다.

원격 명령 실행에서 이러한 환경 변수를 사용하려면 "exec"를 사용해야 합니까?

이는 단지 Python 문제나 RHEL8 문제가 아니라 Ununtu를 포함한 다른 Linux 변형에서도 재현될 수 있습니다.

감사해요.

답변1

두 경우 모두 SSH 연결종료그런 다음 두 번째 명령을 실행하십시오.로컬 머신에서. 예를 들어 /proc/meminfo출력은 다음과 같습니다.현지의어떤 방식으로든 원격으로 작동하지 않고 기계로 작동합니다.

원격으로 실행하려면 다음을 사용하십시오.

ssh user@host cat /proc/meminfo- 알아채다부족ssh 클라이언트에 대한 "cat" 및 "/proc/meminfo" 매개변수를 생성하는 세미콜론은 클라이언트가 빌드되고 원격으로 실행되는 명령줄입니다.

두 번째 경우는 더 까다롭습니다. 세미콜론을 사용하면 로컬에서 실행될 뿐만 아니라교체 주문게다가 5센트. 순진한 변형에서는 변수를 로컬로 대체한 다음 대체된 명령을 원격 실행으로 보냅니다. 원하는 대로 정확하게 작동하려면 다음이 필요합니다.막다로컬 대체, 작은따옴표 사용:

ssh user@host echo '$SHELL'

( 무엇을 의미하는지 비교해보세요. ssh user@host echo `hostname -f`)ssh user@host echo '`hostname -f`'


배울 준비가 된 것 같습니다.안시푸르, 이는 자동화된 방식으로 SSH를 통해 원격으로 특정 작업을 수행해야 하는 필요성을 해결하기 위한 것입니다.

관련 정보