2014-02-28 2 views
21

ssh를 통해 원격 호스트에서 로컬 Bash 기능을 실행하는 영리한 방법이 있습니까? 예를 들어쉘 스크립트 : ssh를 통한 스크립트에서 기능 실행

:

#!/bin/bash 
#Definition of the function 
f() { ls -l; } 

#I want to use the function locally 
f 

#Execution of the function on the remote machine. 
ssh [email protected] f 

#Reuse of the same function on another machine. 
ssh [email protected] f 

그래, 나는 그것이 작동하지 않습니다 알고 있지만,이를 달성 할 수있는 방법이있다?

답변

55

당신은 ssh를 통해 원격 시스템에 기능을 사용할 수 있도록 typeset 명령을 사용할 수 있습니다. 원격 스크립트를 실행하는 방법에 따라 몇 가지 옵션이 있습니다.

#!/bin/bash 
# Define your function 
myfn() { ls -l; } 

는 원격 호스트의 기능을 사용하려면 :

ssh [email protected] << EOF 
    $(typeset -f myfn) 
    myfn 
EOF 
: 당신은 히어 닥을 사용할 수 있습니다

ssh [email protected] "$(typeset -f myfn); myfn" 

또는 : 파이프 귀찮게 왜

typeset -f myfn | ssh [email protected] "$(cat); myfn" 
typeset -f myfn | ssh [email protected] "$(cat); myfn" 

더 나은 아직,

모든 기능을 보내려는 경우 스크립트 내에서 정의 S, 단순히 myfn, 너무처럼 typeset -f를 사용

ssh [email protected] "$(typeset -f); myfn" 

설명

typeset -f myfnmyfn의 정의를 표시합니다.

cat은 함수의 정의를 텍스트로 받고 $()은 원격 쉘에서 정의 된 함수가 될 현재 쉘에서이를 실행합니다. 마지막으로 함수를 실행할 수 있습니다.

마지막 코드는 ssh 실행 전에 함수의 정의를 인라인합니다.

+4

더 나은'사용 -ff' 조판 만 –

+7

@HenkLangeveld에 걸쳐 하나 개의 함수의 정의를 보낼 수

#!/bin/bash # Definition of the function foo() { ls -l; } # Use the function locally foo # Execution of the function on the remote machine. ssh [email protected] "$(declare -f foo);foo" 

declare -f foo 인쇄 - 그것은이 있는지 여부 따라 달라집니다 f()가 호출하는 필수 함수. 필자의 가정에서, 함수 f()는 다른 함수를 필요로합니다. 그렇지 않으면 당신의 제안이 가장 좋을 것입니다. – alvits

+0

훌륭해, 고마워! – edutesoy

4

나는 개인적으로 질문에 대한 정답을 모르지만, 나는 많은 ssh를 사용하여 스스로를 복사하는 설치 스크립트를 가지고있다.

명령을 통해 파일을 복사하고 파일 기능을로드하고 파일 기능을 실행 한 다음 파일을 삭제하십시오.

ssh [email protected] "scp [email protected]:/myFile ; . myFile ; f ; rm Myfile" 
1

또 다른 방법 : 함수의 정의는

관련 문제