web-dev-qa-db-ja.com

MacOS X10.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はspawnsendまたはinteractを認識せず、ファイルを探していますまたはexpectの後のディレクトリ。

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がないと、「stdinは端末ではないため、疑似端末は割り当てられません」というエラーメッセージが表示されます。 ssh -ttを使用すると、2番目のサーバーにログインするとコマンドプロンプトで停止し、ssh-Tを使用するとハングします。 (おそらく同じ場所にありますが、表示されません)

1
Charles Butler

NAT gatewayserver経由でサーバーからファイルをコピーしようとしているだけだと思います。

もっと簡単な解決策をお勧めします。

  1. パスワードなしの認証を設定します(デスクトップ/ Macから上記の両方のサーバーに秘密鍵を置きます)
  2. 次のようなものを使用します

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

    gatewayserverを介してsshトンネルを設定します。これで、Macのポート60002storageserverのポート22に直接接続されます。

  3. この時点で、このトンネルを介してファイルを直接コピーできます。

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

これらのコマンドをbashスクリプトに入れると、目的を達成できます。

UPD:

すべてをまとめると、次の完全なスクリプトがあります。

#!/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で1回だけ実行):

# 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
3
webKnjaZ

sshサーバーにログインするためのシェルスクリプト を見ると、Shebang行が次のようになっていることがわかります。

#!/usr/bin/expect

これはexpectスクリプトであり、bashスクリプトではありません。まだインストールしていない場合は、 Expect をインストールする必要があります。

1
Stephen Kitt

さらに単純化するには:

まず、パスワードではなくキーを使用する必要があります(現在実行しています)。

次に、~/.ssh/configに以下を追加します

Host storageserver
    ProxyCommand ssh gatewayserver nc %h %p

第三に、rsyncを使用して、スクリプトが単一のコマンドになるようにします。

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

これは出発点よりかなり短いです!

0
seumasmac