SSH 세션에 사례 설명이 있다고 가정합니다. 변수를 전달하고 싶습니다.입구원격 컴퓨터에서 제거하고 로컬 컴퓨터의 csv 파일에 저장합니다.
이 예:
#!/bin/sh
set -x
read -p 'Enter the raspberry ip address you want to connect:' Rasp_id
entry=$(sshpass -pthe@Donut ssh -oStrictHostKeyChecking=no pi@"$Rasp_id" "$(cat << 'E3
cd
read -p 'Enter the case you want to configure\n 1.1 WM \n 2.1 LWM\n' option
case $option in
(1)
read -p 'config_wide_motion token' token_w_m
cat SoundEye/NoCAN/config_nocan.json
cat SoundEye/NoCAN/config_processor_motion.json
entry="1_WM"
;;
(2)
read -p 'config_laser_wide_motion token:' token_l_w_m
cat SoundEye/NoCAN/config_nocan.json
cat SoundEye/NoCAN/config_processor_motion.json
entry="1_LWM"
;;
esac
E3
)"
)
printf "$entry"
그런데 내가 원하는 효과가 나오지 않네요. 이 항목이 보고 싶습니다.1_WM또는1_LWM마지막 줄이 완료되면
답변1
당신의:
entry=$(
sshpass...
)
출력을 캡처하여 변수 sshpass
에 저장합니다 .$entry
SoundEye/NoCAN/config_nocan.json
SoundEye/NoCAN/config_processor_motion.json
및 (연결 명령 !?을 두 번 호출하여 ) 의 내용을 출력하므로 cat
이는 입니다 $entry
.
$entry
원격 쉘 변수의 내용( bash
사용 중인 bash에 특정한 것으로 보임)을 출력하지 않으므로 해당 변수를 로컬 쉘 변수 read -p
로 보내지 않습니다 .$entry
이미 구조화된(json) 콘텐츠를 사용하고 있으므로 해당 정보도 포함하고 원격 셸에 다음과 같은 내용을 출력할 수 있습니다.
printf '{ "type": "%s", "config_nocan": %s, "config_processor_motion": %s }\n' \
"$entry" \
"$(<SoundEye/NoCAN/config_nocan.json)" \
"$(<SoundEye/NoCAN/config_processor_motion.json)"
따라서 $entry
로컬 쉘에는 json
구조화된 데이터가 있습니다. 그래서 당신은 이것을 할 수 있습니다 :
type=$(printf '%s\n' "$entry" | jq -r .type)
config_nocan=$(printf '%s\n' "$entry" | jq .config_nocan)
...
ssh
하지만 귀하의 특별한 경우에는 모든 사용자 상호 작용을 로컬로 유지하고 원하는 정보를 전송하는 데만 사용하는 것이 더 합리적이라고 생각합니다.
답변2
나는 이것이 현대의 안전 기준을 깨뜨릴 것이라고 생각합니다. 흥미롭게도 원격 시스템에 기본 수신기를 만들고 여기에 메시지를 게시하여 작업을 수행하고 데이터를 저장합니다. 아니면 공유 디스크를 사용할 수도 있습니다.