それまでWindowsからLAN内のリモートサーバーとrobocopy
で同期(バックアップ)していたが、メイン機をLinuxとしたので、rsync
コマンドに書き換えた。
同期コマンドの違い
robocopy "E:\My Music" X:\Public_Music\ *.* /S /COPY:DT /PURGE /XO /XA:S /XF *.bak /XD iTunes Playlists "Music Center" /R:0 /FFT /FP /NS /NDL /UNICODE /UNILOG:backup.log > $null
rsync -avq --delete --rsh="ssh -F $HOME/.ssh/config" --exclude='*.bak' --exclude='iTunes' --exclude='Playlists' --exclude='Music Center' --log-file="backup.log" "/mnt/nas/My Music/" server:"/mnt/nas/Public/Public_Music/"
--rsh="ssh -F $HOME/.ssh/config"
、server:"/mnt/nas/Public/Public_Music
とすることで、以下のようにネットワークドライブのマウントする手間が省けた1。
#ネットワークドライブとの接続確認
[String]$netdrive = Get-PSDrive | Where-Object {$_.Name -eq 'X'}
if($netdrive -eq $null){
Write-Output ("Xと繋がってません。")
# 認証情報のインスタンスを生成する
$securePass = ConvertTo-SecureString "password" -AsPlainText -Force;
$cred = New-Object System.Management.Automation.PSCredential "arimasou16", $securePass;
New-PSDrive -Persist -Name "X" -PSProvider FileSystem -Root "\\192.168.0.10\share_point" -Credential $cred;
}
そして、robocopy
では-L
、rsync
では--dry-run
、とオプションを付けることで実行前確認することができるので、いつも同期する前にdry runの結果をログ出力して、それを確認してから同期していた。
実行確認ダイアログの出し方の違い
#確認メッセージポップアップ
[String]$ret = [System.Windows.Forms.MessageBox]::Show('バックアップ(音楽)の予想が出来ました。処理を継続しますか?', '確認メッセージ', [System.Windows.Forms.MessageBoxButtons]::YesNo, [System.Windows.Forms.MessageBoxIcon]::Exclamation)
if ($ret -eq 'No') {
exit
}
zenity --question --text="バックアップ(音楽)の予想が出来ました。処理を継続しますか?"
if [ "$?" -ne 0 ]; then
exit
fi
Yesなら継続される。
公開鍵認証するときのパスフレーズを省略(一度だけ入力)
最初は、以上で良しとしていたが、公開鍵認証のパスフレーズを毎回入力するのが手間に感じるのと、同期ディクレトリが複数に分かれている場合、気付いたらパスフレーズの入力を求められていて、時間制限が過ぎて接続が切れるということが何度があったので省略(一度だけ入力)することにした。
$ ./rsync_backup.sh
Enter passphrase for key '~/key/id_ed25519':
Enter passphrase for key '~/key/id_ed25519':
Connection closed by 2345:ffff:cccc:6666:aaaa:eeee:ffff:dddd port 22
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(231) [sender=3.2.7]
方法は、以下の参考にした。
【ssh】公開鍵認証するときのパスフレーズを省略する方法の紹介 – fumidzuki
$ ssh-add /home/username/key/id_ed25519
Enter passphrase for key '/home/username/key/id_ed25519':
これを行うとログアウトするまで、パスフレーズを省略することが出来る。ログアウト、終了すると、次のログインでは再度入力を求められるが、それすら省略するなら、パスフレーズの設定を止めた方がいい気がする。
ssh-add
の戻り値で、一度実行しているかどうかを確認出来そうなので、以下の条件ブロックを追記した。
agent="$(ssh-add -L)"
if [[ "$agent" == "The agent has no identities." ]]; then
ssh-add ~/key/id_ed25519
fi
以上。
追記 2024-02-23
以上のようなブロックを付けなくても、 ~/.ssh/configにAddKeysToAgent yes
を追記すれば、良い。
公開鍵認証によるSSHで使う鍵管理をssh-agentで楽する - もちゅろぐ
追記ここまで
-
robocopy
でも出来るのかも知れないけど。分からない。 ↩︎