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 が存在しない場合、「標準入力が端末ではないため、擬似端末が割り当てられません」というエラーメッセージが表示されます。 ssh -ttを使用すると、2番目のサーバーにログインするとコマンドプロンプトで停止し、ssh -Tを使用すると停止します。 (おそらく同じ場所にいるようですが見えません)
ベストアンサー1
NATの背後にあるサーバーから.NATを介してファイルをコピーしようとしているようですgatewayserver
。
より簡単な解決策を提案します。
- パスワードなしの認証設定(デスクトップ/Macの秘密鍵を上記の両方のサーバーに入力)
次のようなものを使用してください
ssh -MNf -L 60022:storageserver:22 username@gatewayserver
SSHトンネルを設定します
gatewayserver
。これで、Macポートがポート60002
に直接接続されました。22
storageserver
これで、このトンネルから直接ファイルをコピーできます。
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