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 )를 전달하려고 합니다 . 각 변수 앞에 두는 것은 도움이 되지 않습니다.$timing
echo
/
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
답변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>=