SSH を使用する Bash スクリプトは変数値を返しません。

SSH を使用する Bash スクリプトは変数値を返しません。

KVM仮想マシンの移行を支援するためにbashスクリプトを作成していますが、ダミーコードを使用して進行状況を説明します。

私は機能を使用してリモートサーバー上で実行されるタスクを分類し、ユーザーから必要な情報を取得し、ユーザーが質問に答えるために必要な情報を表示します。何が起こっているのかを把握するために使用する3つの方法を示すために、以下に3つのスクリプトがあります。

最初はSSHを含まず、正常に動作します。

#!/bin/bash

getname()
{
echo -n "Name:  "
read name
}

gethobby()
{
echo -n "hobby:  "
read hobby
}

showresults()
{
echo "$name"
echo "$hobby"
}

getname
gethobby
showresults

2番目のスクリプトは私が動作させる方法です。 SSHを介してリモートサーバーで関数を実行しようとするのに必要なように、他の関数は変数値にアクセスできません。

#!/bin/bash
server1='10.1.1.153'

getname()
{
echo -n "Name:  "
read name
}

gethobby()
{
uptime
echo -n "hobby:  "
read hobby
}

showresults()
{
echo "$name"
echo "$hobby"
}

getname
echo -n "server: "
read sname
ssh -t sysadmin@"${!sname}" "$(typeset -f); gethobby"
showresults

3番目のスクリプトは機能しますが、本番では使用されないようです。コマンドを使用して複数のsshを実行する必要があるため、途中で途切れた行があり、出力が混乱します。このアプローチを使用しても、変数から必要な値にアクセスできます。

#!/bin/bash
server1='10.1.1.153'

getname()
{
    echo -n "Name:  "
    read name
}

gethobby()
{
    ssh -t sysadmin@"${!sname}" "$(typeset -f); uptime"
    echo -n "hobby:  "
    read hobby
}

showresults()
{
    echo "$name"
    echo "$hobby"
}

getname
echo -n "server: "
read sname
gethobby
showresults

それでは、スクリプト2を操作する方法はありますか?

更新:はい、testという名前が悪く、使用するのにも悪いことがわかります。しかし、実際のコードは大きくて複雑なので、実際のコードではありません。

機能部分については、あなたの言葉が正しいでしょう。しかし、私はssh user@ip機能で使用するプログラムがたくさんあります。別のsshコマンドを実行する必要なく、関数内のすべてを拡張して実行するので、うまくいくと思います。

2番目のスクリプトは、関数から値を取得できないことを除いてうまく機能します。エコーされると、ユーザーが入力した値の代わりに空になります。

ベストアンサー1

関数を定義する必要があります。離れて機械:

remote_hobby=$( ssh -t sysadmin@"${!name}" bash -c 'test2() { read -p "Hobby: " hobby; }; test2; echo "$hobby"' )

おすすめ記事