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
リモートホストで実行された2つのコマンドがそれぞれ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
)
その後、リモートコマンドによって生成された2行を2つのローカル変数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>=