• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[bash] rsync データバックアップ)

[bash] rsync データバックアップのシェルでの変数参照方法

このQ&Aのポイント
  • rsyncを使用してローカルサーバのデータをリモートサーバにコピーするためのシェルスクリプトを作成しようとしています。
  • シェル内で変数を参照する際に、正しい書式を使用する必要があります。
  • 変数の参照方法を正しく記述することで、リモートサーバへのデータ移行が成功するはずです。

質問者が選んだベストアンサー

  • ベストアンサー
  • freetaka
  • ベストアンサー率53% (106/197)
回答No.1

前回もエスケープ処理で苦しんでいたようですが できればエスケープ処理をあまりしないような スクリプトを組むようにすると間違いが少なくなります それと処理の中でシングルクォーテーションを使用したため expect -c ' spawn rsync -auvz --delete -e "ssh -p 10022" ' までで expect の処理が終わってしまっています '$line' のようにしてしまうと シングルクォーテーションの中で変数の内容が展開されず そのまま $line と表示されます そしてechoの中のバッククォーテーション中も同様です どうしてもエスケープ処理したいのであれば エスケープ処理の仕方をネットで調べればいろいろでてきます dateコマンドのところで使っているバッククォーテーションの場合は 終わりのバッククォーテーションのところまでをコマンドとみなすので ダブルクォーテーションがそのまま中で使えるのも覚えておくとよいでしょう 次の1行を修正 echo `date +%Y/%m/%d" "%H:%M:%S`" "$line" のバックアップを取得します。" >> $LOG ↓ echo "`date "+%Y/%m/%d %H:%M:%S"` ${line} のバックアップを取得します。" >> $LOG LOGの中をまっさらにしてから中に記述したいのであれば echoの前に次を追記しこんな感じに : > $LOG echo "`date "+%Y/%m/%d %H:%M:%S"` ${line} のバックアップを取得します。" >> $LOG 内容も表示しつつ追記でログ保存したいなら echo "`date "+%Y/%m/%d %H:%M:%S"` ${line} のバックアップを取得します。" | tee -a $LOG 次の1行を修正 spawn rsync -auvz --delete -e "ssh -p 10022" '$line' root@BのIPアドレス:/backup/ ↓ spawn rsync -auvz --delete -e "ssh -p 10022" $line root@BのIPアドレス:/backup/ 次の1行を修正 done < /etc/param/backup.param ↓ done < $PARAM まとめると #!/bin/bash LOG=/var/log/backup.log PARAM=/etc/param/backup.param while read line; do echo "`date "+%Y/%m/%d %H:%M:%S"` ${line} のバックアップを取得します。" >> $LOG expect -c ' spawn rsync -auvz --delete -e "ssh -p 10022" $line root@BのIPアドレス:/backup/ expect "password:" send "パスワード\n" interact ' done < $PARAM テストしてませんがうまく動作するとよいですね エラー等がでる場合は補足ください 以上参考までに

The-Key
質問者

お礼

2日連続のコメント、本当にありがとうございます。 頂いた内容に修正してみたところ、実行結果で spawn rsync -auvz --delete -e ssh -p 10022 $line root@BのIPアドレス:/backup/ となり、変数line を読み込んでくれない状態となってしまいました。 その後、回答 No,2 の trapzium さんのアドバイスに従い、認証鍵による ssh 接続にしたところ、うまくバックアップを取得することが出来ました。 一安心したところで freetaka さんへのお礼コメント用にパスワード認証バージョンの方を実行したところ、なぜか正常終了しました、、、 スペースやタブなどの空白部分に何か問題があったのか、今となっては真実は闇の中ですが、結果として2通りのやり方を知ることが出来ました。 失敗時の処理結果を記載できなくて申し訳ないですが、これにて解決とさせて頂きます。 ベストアンサーは、2日連続でコメント頂いた freetaka さんを選ばせて頂きます。 ありがとうございました!

その他の回答 (1)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

何か苦労してるようなので、前提条件に突っ込むのもあれなので黙っていましたが、ssh 使うならパスワード入力を不要にした方が簡単だと思います。 いくつか方法はありますが、汎用的なのは空のパスフレーズで公開鍵作成して、 ssh-keygen -t ed25519 -N "" -C "for rsync" -f ~/.ssh/id_backup ssh BのIPアドレス -p 10022 -l root "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_backup.pub しておけば expect 使わずに rsync -auvz --delete -e "ssh -p 10022 -i $HOME/.ssh/id_backup" "$line" root@BのIPアドレス:/backup/ できます。 そんな方法もあるよということで。あと古い ssh だと ed25519 使えないので ecdsa か dsa

The-Key
質問者

お礼

コメントありがとうございます。 こちらの方法で無事バックアップをすることが出来ました! 最初の作成時に「公開鍵作るよりパスワード認証の方が作り込みラクじゃない?」と思い、見事にハマってしまいました。 結果としてどちらの認証方式でも処理が出来るようになったので感謝です。 ありがとうございました!

関連するQ&A