SSH 세션에서 로컬 시스템으로 변수를 저장하고 전달하는 방법

SSH 세션에서 로컬 시스템으로 변수를 저장하고 전달하는 방법

SSH 세션에서 원격 컴퓨터에 생성된 셸 변수를 검색하려고 합니다.

echo -n "Enter the raspberry ip address you want to connect:"
read Rasp_id

sshpass -pthe@Donut ssh -oStrictHostKeyChecking=no pi@"$Rasp_id" << 'E7'
        #sudo rm -r SoundEye.zip
        mac_add=$(ip link show wlan0 | grep link | awk '{print $2}')
        timing=$(date)
E7

echo ${mac_add}
echo ${timing}

$mac_add로컬 컴퓨터에 있는 SSH 세션에서 변수(이 경우 and )를 전달하려고 합니다 . 각 변수 앞에 두는 것은 도움이 되지 않습니다.$timingecho/

echo /${mac_add}
echo /${timing}

선언하려는 모든 변수 앞에 내보내기를 추가하는 경우에도 마찬가지입니다. 문제도 해결되지 않습니다.

답변1

원격 호스트에서 실행된 두 명령이 각각 한 줄의 출력을 생성한다고 가정합니다.

{ read mac_addr; read timing; } < <(
sshpass -pthe@Donut ssh -o StrictHostKeyChecking=no "pi@$Rasp_id" <<'SSH_END'
    ip link show wlan0 | awk '/link/ { print $2 }'
    date
SSH_END
)

그러면 원격 명령에 의해 생성된 두 줄을 두 개의 로컬 변수 mac_addr와 로 읽습니다 timing. 데이터는 read리디렉션 프로세스 교체를 통해 두 호출 모두에 전달됩니다.

date원격 호스트의 명령이 로컬과 동일한 내용을 출력한다고 가정하면 이는 단순화될 수 있습니다.

timing=$(date)
mac_addr=$(sshpass -pthe@Donut ssh -o StrictHostKeyChecking=no "pi@$Rasp_id" <<'SSH_END'
    ip link show wlan0 | awk '/link/ { print $2 }'
SSH_END
)

그렇지 않으면

timing=$(date)
mac_addr=$(sshpass -pthe@Donut ssh -o StrictHostKeyChecking=no "pi@$Rasp_id" ip link show wlan0 | awk '/link/ { print $2 }' )

... awk로컬에서 명령을 실행합니다.


나머지 코드에 대한 간단한 메모: 기억하세요변수 확장을 큰따옴표로 묶음, 다음을 사용 read하면 bash사용자에게 프롬프트를 표시할 수 있다는 점을 기억하세요 -p.

read -p 'Enter the raspberry IP address you want to connect: ' Rasp_id

반품,왜 printf가 echo보다 나은가요?

답변2

ssh세션에서 생성된 출력을 검색하려고 하므로 ssh세션 출력을 쉘 변수에 저장한 다음 해당 출력을 구문 분석하여 관련 비트를 추출할 수 있습니다.

다음이 작동합니다. 생성될 수 있는 다른 메시지(예: motd)와 구별하기 위해 관련 행 앞에 "시작 태그"를 추가합니다.

raw_output=$(sshpass -pthe@Donut ssh -oStrictHostKeyChecking=no pi@"$Rasp_id" 'echo "MAC=$(ip link show eth0 | awk '\''/^ *link/{print $2}'\'')"; echo "DATE=$(date)"')

mac_add=$(sed -E '/^MAC=/s/^[^=]+=//;t;d' <<< "$raw_output")
timing=$(sed -E '/^DATE=/s/^[^=]+=//;t;d' <<< "$raw_output")

그런 다음 호출을 통해 관련 값이 추출되고 ( 관련 줄 시작 부분의 해당 부분을 sed검색하고 "nothing"으로 대체) 스크립트에 로컬인 bash 변수에 저장됩니다.<tag>=

관련 정보