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

두 번째 스크립트는 내가 작동시키려는 방법입니다. 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

세 번째 스크립트는 작동하지만 프로덕션에서는 사용되지 않을 것 같습니다. 명령을 사용하여 여러 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 명령을 실행할 필요 없이 함수 내부의 모든 것을 확장하고 실행하기 때문에 작동한다고 생각합니다.

두 번째 스크립트는 함수에서 값을 가져올 수 없다는 점을 제외하면 잘 작동합니다. 에코되면 사용자가 입력한 값 대신 비어 있습니다.

답변1

함수를 정의해야 합니다.외딴기계:

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

관련 정보