有馬総一郎のブログ

(彼氏の事情)

2024年01月21日 20:22:54 JST - 3 minute read - Comments - Linux

公開鍵認証するときのパスフレーズを省略(一度だけ入力)してrsyncでネットワークドライブ先と同期(バックアップ)する

それまで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では-Lrsyncでは--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/configAddKeysToAgent yesを追記すれば、良い。

公開鍵認証によるSSHで使う鍵管理をssh-agentで楽する - もちゅろぐ

追記ここまで


  1. robocopyでも出来るのかも知れないけど。分からない。 ↩︎