로컬 스크립트에서 함수를 생성하고 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
...기능이 없습니다.
주의와 명령 &&
사이 . 실패하면 호출이 중지됩니다. 이는 (예기치 못한 상황으로 인해) 필요한 디렉터리가 존재하지 않는 경우 실수로 명령이 실행되는 것을 방지하는 일반적인 방법입니다. 스크립트에서 누락된 디렉터리를 보고할 수도 있습니다.cd
git
git
cd
/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`