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
または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を使用するとハングします。 (おそらく同じ場所にありますが、表示されません)
NAT gatewayserver
経由でサーバーからファイルをコピーしようとしているだけだと思います。
もっと簡単な解決策をお勧めします。
次のようなものを使用します
ssh -MNf -L 60022:storageserver:22 username@gatewayserver
gatewayserver
を介してsshトンネルを設定します。これで、Macのポート60002
はstorageserver
のポート22
に直接接続されます。
この時点で、このトンネルを介してファイルを直接コピーできます。
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
sshサーバーにログインするためのシェルスクリプト を見ると、Shebang行が次のようになっていることがわかります。
#!/usr/bin/expect
これはexpect
スクリプトであり、bash
スクリプトではありません。まだインストールしていない場合は、 Expect をインストールする必要があります。
さらに単純化するには:
まず、パスワードではなくキーを使用する必要があります(現在実行しています)。
次に、~/.ssh/config
に以下を追加します
Host storageserver
ProxyCommand ssh gatewayserver nc %h %p
第三に、rsync
を使用して、スクリプトが単一のコマンドになるようにします。
rsync -havz storageserver:/path/retrievedfolder/ backup/retrievedfolder.$(date +%Y%m%d)
これは出発点よりかなり短いです!