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 sendinteractexpect

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を使用すると、2番目のサーバーにログインするとコマンドプロンプトで停止し、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で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

おすすめ記事