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

リモートホストで実行された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ローカルでコマンドを実行します。


残りのコードに関する簡単なメモ:覚えておいてください変数拡張を二重引用符で囲む、以下を使用するreadbash、ユーザーにプロンプ​​トを表示できることに注意してください-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>=

関連情報