함수를 로컬로 선언하고 SSH 연결의 원격 측에서 사용할 수 있습니다.

함수를 로컬로 선언하고 SSH 연결의 원격 측에서 사용할 수 있습니다.

로컬 스크립트에서 함수를 생성하고 SSH 연결을 통해 원격 호스트에서 호출하고 싶습니다. 이것이 가능합니까?

set -e
gitpull () { 
    cd /var/www/html
    STATUS=$((git status) 2>&1)
    echo $STATUS
}

ez ssh two << 'EOSSH'
    gitpull
EOSSH

기본적으로 다음과 같은 작업을 수행해야 합니다. 코드를 복제하고 싶지 않습니다.

ez ssh two << 'EOSSH'
    gitpull
EOSSH

ez ssh three << 'EOSSH'
    gitpull
EOSSH

ez ssh four << 'EOSSH'
    gitpull
EOSSH

etc...

답변1

ez ssh쉘 호출을 가정합니다 (원격일 수도 있음).SSH제안) 표준 입력에서 이 코드를 구문 분석하고 쉘이 스크립트를 해석한 쉘과 동일하고(동일한 로케일에서 실행됨) ksh, bash 또는 zsh(지원용 typeset -f)인 경우 다음을 수행할 수 있습니다. 이것:

ez ssh two << EOSSH

$(typeset -f gitpull)
gitpull

EOSSH

즉, 함수를 호출하기 전에 함수를 호출하는 셸에 함수 정의가 전달됩니다 gitpull. ez ssh또는 다음을 사용하여 zsh:

ez ssh two << EOSSH
$functions[gitpull]
EOSSH

아니면 물론 이렇게 할 수도 있습니다:

gitpull='
  cd /var/www/html
  STATUS=$((git status) 2>&1)
  echo $STATUS
'
ez ssh two << EOSSH
$gitpull
EOSSH

또는

printf '%s\n' "$gitpull" | ez ssh two

다른 접근 방식은 이미 제안된 대로 루프를 사용하거나 다음을 수행하는 것입니다.

ez_ssh_gitpull() {
  ez ssh "$@" << 'EOSSH'
    cd /var/www/html
    STATUS=$((git status) 2>&1)
    echo $STATUS
EOSSH
}

ez_ssh_gitpull two
ez_ssh_gitpull three

답변2

루프를 찾고 있는 것 같습니다.

for remote in two three four; do
    ez ssh "$remote" <<'END_SSH'
script
goes here
END_SSH
done

여기서 문서는 파일과 같이 명령으로 리디렉션되는 문서일 뿐입니다. 함수 호출이 이 문서가 아닌 리디렉션된 파일에 있는 경우 함수 정의를 호출하려면 동일한 실행 환경에서 사용할 수 있어야 합니다. 여기 문서의 함수 호출에도 동일하게 적용됩니다.

로컬 쉘에서 함수를 정의한다고 해서 함수가 통과 가능해지는 것은 아닙니다 ssh.


두 줄

STATUS=$((git status) 2>&1)
echo $STATUS

한 줄로 줄일 수 있음

git status 2>&1

따라서 원격으로 실행될 전체 스크립트는 다음과 같습니다.

cd /var/www/html && git status

...기능이 없습니다.

주의와 명령 &&사이 . 실패하면 호출이 중지됩니다. 이는 (예기치 못한 상황으로 인해) 필요한 디렉터리가 존재하지 않는 경우 실수로 명령이 실행되는 것을 방지하는 일반적인 방법입니다. 스크립트에서 누락된 디렉터리를 보고할 수도 있습니다.cdgitgitcd/var/www/html

또한 두 출력 스트림의 조합도 제거했습니다. 이를 통해 호출 셸에서 이 작업을 수행하거나 원하는 경우 별도로 처리할 수 있습니다.

답변3

구분된 문서 외부에서 함수를 만들고 구분된 문서에서 호출하는 것이 가능합니까?

글쎄, "여기 문서"라는 단어를 인용하지 않고 "명령 대체"를 사용하는 한 다음과 같습니다.

gitpull () { echo $1; }

cat << 'EOF'
$(gitpull T1)
EOF

$(gitpull ARG1)    <--- output of `cat`

cat << EOF 
$(gitpull ARG1)
EOF

ARG1               <--- output of `cat`

관련 정보