bash - 명령어 - 쉘스크립트 문법




ssh를 통한 Bash 스크립트 실행하기 (4)

나는 SSH를 머신에 넣고 디렉토리를 생성 할 Bash 스크립트를 작성하려고한다. 장기 목표는 좀 더 복잡하지만, 지금은 간단하게 시작하고 있습니다. 그러나 그만큼 간단하기 때문에 나는 그것을 얻을 수 없을 것 같습니다. 내 코드는 다음과 같습니다.

#!/bin/bash
ssh -T [email protected] <<EOI

# Fix "TERM environment variable undefined" error.
TERM=dumb
export TERM

# Store todays date.
NOW=$(date +"%F")
echo $NOW

# Store backup path.
BACKUP="/backup/$NOW"
[ ! -d $BACKUP ] && mkdir -p ${BACKUP}
echo $BACKUP

exit
EOI

명시 적 오류없이 실행됩니다. 그러나 에코 된 $ NOW 및 $ BACKUP 변수는 공백으로 표시되고 / backup 디렉토리는 작성되지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?


SSH를 통해 로컬 스크립트를 실행하는 방법

개요:

스크립트 파일을 복사하지 않고 SSH를 통한 스크립트 실행. 간단한 SSH 연결과 로컬 스크립트가 필요합니다.

암호:

#!/bin/sh
print_usage() {
        echo -e "`basename $0` ssh_connexion local_script"
        echo -e "Remote executes local_script on ssh server"
        echo -e "For convinient use, use ssh public key for remote connexion"
        exit 0
}

[ $# -eq "2" ] && [ $1 != "-h" ] && [ $1 != "--help" ] || print_usage

INTERPRETER=$(head -n 1 $2 | sed -e 's/#!//')

cat $2 | grep -v "#" | ssh -t $1 $INTERPRETER

예 :

  • ssh-remote-exec root @ server1 myLocalScript.sh #for Bash
  • ssh-remote-exec root @ server1 myLocalScript.py #for 파이썬
  • ssh-remote-exec root @ server1 myLocalScript.pl #for Perl
  • ssh-remote-exec root @ server1 myLocalScript.rb # 루비 용

단계별 설명

이 스크립트는 다음 작업을 수행합니다. 해석기 (예 : Perl, Python, Ruby, Bash 인터프리터)를 얻으려면 2 °는 SSH를 통해 원격 interpeter를 시작하고 3 °는 SSH를 통해 모든 스크립트 본문을 보냅니다.

로컬 스크립트 :

로컬 스크립트는 #! / path / to / interpreter로 시작해야합니다 - #! / bin / sh for Bash 스크립트 - #! / usr / bin / perl for Perl 스크립트 - #! / usr / bin / python for Python script - #! 루비 스크립트를위한 / usr / bin / ruby

이 스크립트는 로컬 스크립트 확장을 기반으로하지는 않지만 #! 정보.


"EOI"가 이스케이프되지 않기 때문에 로컬 호스트의 쉘이 $ NOW 및 $ BACKUP에서 변수 대체를 수행하고 있습니다. 바꾸다

 ssh [email protected] <<EOI

 ssh [email protected] <<\EOI

스크립트가 전송되기 전에 로컬 호스트에서 대체 작업을 수행하고 있습니다.

첫 번째 줄을 다음으로 변경하십시오.

ssh -T [email protected] <<'EOI'

이렇게하면 원시 스크립트가 원격 호스트로 전송되어 해석됩니다.

혼합을 원하면 (예를 들어 로컬 호스트에서 date 명령을 실행하려면 ssh 행을 변경하지 않고 개별 명령을 인용해야합니다).

ssh -T [email protected] <<EOI

# Execute the date command on the local machine.  The assignment still
# happens on the remote machine
NOW=$(date +"%F")

# Quote your $ so that the replacement happens on the remote machine
echo \$NOW

시험:

NOW=`date +"%F"`




ssh