MacOS X 10.10에서 Unix/Linux 서버로의 SSH용 쉘 스크립트

MacOS X 10.10에서 Unix/Linux 서버로의 SSH용 쉘 스크립트

MacOSX에서 bash 스크립트를 사용하여 ssh를 통해 서버에 로그인하려고 합니다.

#!/bin/bash

spawn ssh username@gatewayserver
expect "password"
send "Mypassword\r"
interact

spawn ssh username@storageserver
expect "password"
send "Mypassword\r"
interact
cd /path

spawn scp -r retrievedfolder username@gatewayserver:/path/
expect "password"
send "Mypassword\r"
interact

exit
exit

spawn scp -r username@gatewayserver:/path/retrievedfolder .
expect "password"
send "Mypassword\r"
interact

spawn ssh username@gatewayserver
expect "password"
send "Mypassword\r"
interact
rm -r retrievedfolder/
exit

mv -nv -- "$retrievedfolder" "$retrievedfolder.$(date +%Y%m%d)"
mv /retrievedfolder /backup

중복될 수 있는 코드를 따라갈 수 있는 경우 목표는 게이트웨이 서버에 로그인하여 스토리지 서버에 액세스하는 것입니다. cd를 해당 폴더에 넣으세요. 게이트웨이 서버의 디렉터리에 원하는 폴더를 안전하게 복사한 다음 게이트웨이 서버의 파일을 데스크톱으로 복사합니다. 그런 다음 게이트웨이 서버에서 검색된 폴더(저장 용량 제한)를 삭제하고 복사된 폴더를 파일 이름 끝에 현재 날짜가 추가된 데스크탑의 폴더로 이동하려고 합니다. Linux를 실행 중이지만 MacOS의 bash가 인식하지 못 spawn send하거나 .interactexpect

Stephen Kitt와 webKnjaZ의 도움으로 내 코드는 다음과 같이 생겼습니다.

#!/bin/bash

ssh username@gatewayserver 'ssh username@storageserver; cd /path/; scp -r retrievedfolder username@gatewayserver:/path/'

scp -r username@gatewayserver:/path/retrievedfolder .

ssh username@gatewayserver 'rm -r retrievedfolder/'

mv -nv -- "retrievedfolder" "retrievedfolder.$(date +%Y%m%d)"
mv retrievedfolder.$(date +%Y%m%d)/ backup/

비밀번호 없는 SSH가 올바르게 설정되면 거의 작동합니다. ssh -tt가 없으면 "표준 입력이 터미널이 아니기 때문에 의사 터미널이 할당되지 않습니다"라는 오류 메시지가 표시됩니다. ssh -tt를 사용하면 두 번째 서버에 로그인하면 명령 프롬프트에서 중지되고 ssh -T를 사용하면 정지됩니다. (아마도 같은 장소에 있을 것 같지만 보이지는 않습니다)

답변1

NAT 뒤에 있는 서버에서 .NAT를 통해 파일을 복사하려고 하는 것 같습니다 gatewayserver.

더 간단한 솔루션을 제안합니다.

  1. 비밀번호 없는 인증 설정(데스크톱/Mac의 개인 키를 언급된 두 서버에 모두 입력)
  2. 다음과 같은 것을 사용하십시오

    ssh -MNf -L 60022:storageserver:22 username@gatewayserver
    

    SSH 터널을 설정합니다 gatewayserver. 이제 Mac 포트가 포트 60002에 직접 연결되었습니다 .22storageserver

  3. 이제 이 터널을 통해 직접 파일을 복사할 수 있습니다.

    scp -P 60022 -R username@localhost:/path/to/folder .
    

이 명령을 bash 스크립트에 넣으면 원하는 것을 얻을 수 있습니다.

고쳐 쓰다:

모든 것을 종합하면 전체 스크립트는 다음과 같습니다.

#!/bin/bash

# set up tunnel
ssh -MNf -L 60022:storageserver:22 gatewayserver_username@gatewayserver || true

# copy files __directly__ into correct backup folder
scp -P 60022 -R "storageserver_username@localhost:/remote/path/to/retrievedfolder/at/storageserver" "/local/path/to/backup/retrievedfolder.`date +%Y%m%d`"

전제 조건(Mac에서만 한 번 실행):

# Create SSH keys @ local machine
ssh-keygen

# Put your local SSH key to the gateway server
ssh-copy-id gatewayserver_username@gatewayserver

# Enable tunnel (will not ask your password if previous steps are correct)
ssh -MNf -L 60022:storageserver:22 gatewayserver_username@gatewayserver

# Put your local SSH key to the storageserver server
ssh-copy-id -p 60022 storageserver_username@localhost

답변2

당신이 보면SSH 서버에 로그인하기 위한 쉘 스크립트shebang 라인은 다음과 같습니다.

#!/usr/bin/expect

이것은 expect스크립트가 아니라 bash스크립트입니다. 당신은 설치해야합니다예상되는아직 하지 않았다면.

답변3

더욱 단순화하세요:

먼저, 비밀번호 대신에 키를 사용해야 합니다(지금 사용하고 있음).

둘째, 다음을 추가하십시오.~/.ssh/config

Host storageserver
    ProxyCommand ssh gatewayserver nc %h %p

셋째, 다음을 rsync사용하여 스크립트를 단일 명령으로 만듭니다.

rsync -havz storageserver:/path/retrievedfolder/ backup/retrievedfolder.$(date +%Y%m%d)

처음 시작한 곳보다 조금 더 짧은 곳이에요!

관련 정보