Mac OSでのSambaパーティションのマウントを自動化する

3日目に、ファイルクリーニング、バックアップ、急流、およびその他の家庭のニーズのためにサーバーを上げました。 そこには、特に個人データとTimeMachimeを介したラップトップバックアップの場所を備えた、多くのボールを持つサンバが展開されました。 すぐに、私はボールとバックアップ用の画像を常に手動でマウントするのが好きではありませんでした。 以下では、このプロセスを自動化するためにコミュニティとスクリプトを共有します。



不便な理由



sambaに接続するたびに、マウスを公平に突く必要があります:Finder->サーバーに接続->サーバー名を入力(->初めてパスワードを要求するとき)->接続する必要のあるフォルダーを選択-> OK 次に、sambaによってマウントされたディレクトリにバックアップする場合は、.sparsebundleイメージも作成してマウントする必要があります。 おそらく、同じネットワーク上に常にあり、サーバーと同じ方法でオフにならない固定PCで数週間ごとに実行する場合、これはおそらくそれほど面倒ではありません。 しかし、ノートパソコンの電源を入れたり、ウェイクアップするたびにこれを行う必要がある場合、どのゲートにも入りません。 さらに、パーティションをマウント解除してネットワークを変更しないと(たとえば、隣人を訪問するために)、ボールのあるサーバーが見つからないため、スリープから抜けるとシステムがほとんどハングし、まれにカーネルパニックでも発生することが判明しました。 これはすべて、サーバーを上げる喜びと、バックアップが必要になるまでバックアップについて思い出すことさえできない夢(pah pah pah)を大きく覆い隠してしまいました。 プロセスを自動化することが決定されました。



最初は



司祭では、サンバをマウントする方法がグーグルで調べられ、次のタイプのいくつかの同一コマンドから小さなスクリプトが生まれました。

mkdir -p /mount/point
      
      





TimeMachineの画像添付ファイルの作成方法も見つかりました。

 hdiutil attach -mountpoint /mount/point /path/to/image.sparsebundle/
      
      



hdutilはよりインテリジェントであることが判明し、フォルダーの作成では機能しませんでした。

スクリプトの最初のバージョンは準備ができていました。



安全性



マウント時にパスワードを明示的に指定するのは非常に面倒でした。 mount_smbfsのman読んだ後、 nsmb.confについて学びました 。 しかし、とにかくパスワードは平文のファイルのどこかに保存されるため、このアイデアはあまり好まれていませんでした。 私はすぐに、GUIを介してパスワードが1回要求され、その後キーチェーンから引き出されたことを思い出しました。 使いたかった。 nsmb.confを取り、-N スイッチmount_smbfsに追加したように、パスワードは自動的に置き換えられました(奇跡は起こりませんでした)。 最初にセキュリティを介して取得し、適切な場所に転送する必要があります。 これらの目的のために、この機能はグーグル化され、ニーズに合わせてやり直されました。

 get_inet_pwd () { security find-internet-password -gwl $1 }
      
      





その後、明示的なパスワードは次のように置き換えられました。

 mount -t smbfs //user:"$(get_inet_pwd server-pc)"@server-pc/shara_name /mount/point
      
      





パラノイアは退きましたが、好奇心と完璧主義が残っていたため、問題は続きました。



機能強化と拡張



一度にすべてをマウントするスクリプトを1つ作成したかったので、拡張可能にしてコードを何度も繰り返す必要はありませんでした。また、システムに既にマウントされており、2度目にマウントしようとしていないことを確認しました。 すぐに言ってやった。 すべてを順番に説明します。



マウントを決定するために、最初の段階で、最も「不器用な」方法が使用されました

 if [ ! -d /mount/point/ ]; then mkdir -p /mount/point mount … fi
      
      





しかし、すぐにディレクトリが存在することが明らかになりましたが、何かのマウントポイントではありません。 したがって、チェックする関数を作成しました:

 is_volume_mounted() { volume_name=$1 mount | awk -v volume_name=$volume_name '$3 == volume_name {print $3}' }
      
      



この方法も理想的ではありませんが、単にディレクトリをチェックするよりもはるかに優れています。



バックアップイメージを確認するために同じことを行いました。

 is_image_attached() { img_path=$1 df -Hl | awk -v img_path=$img_path '$9 == img_path {print $9}' }
      
      





いくつかの熟考とフォーラムを読んだ後、メソッドは肥大化し、すぐにイメージがマウントされているかどうかを確認し、マウントされていない場合はマウントし始めました。

 try_attach_fs_image() { img_path=$1 mnt_pnt_path=$2 # check existance of image file if [ -d $img_path ]; then # check if image alredy attached in system if [[ $(df -Hl | awk -v img_path=$img_path '$9 == img_path {print $9}') != "" ]]; then echo image $img_path alredy attached else hdiutil attach -mountpoint $mnt_pnt_path $img_path fi fi }
      
      





次に、サーバーから任意の数のボールをマウントする際にチェックと自動化を実行する機能が必要でした。 これが判明した方法です:

 try_mount_server_samba() { smb_vol_name=$1 mnt_pnt_path=$2 # check if samba share exist in network if [[ $( is_samba_exist $smb_vol_name ) != "" ]]; then # check if samba alredy mounted if [[ $( is_volume_mounted $mnt_pnt_path ) != "" ]]; then # show message about that echo volume $mnt_pnt_path alredy mounted else # check if moint point directory not exist if [ ! -d $mnt_pnt_path ]; then mkdir -p $mnt_pnt_path fi # otherwise - mount volume mount -t smbfs //user:"$(get_inet_pwd server-pc)"@server-pc/$smb_vol_name $mnt_pnt_path fi fi }
      
      





気配りのある読者は、まず、サーバー名をハードコーディングするのではなく、関数にパラメーターで渡すことができます。次に、不明な関数is_samba_existがスクリプトに見つかります。



私は順番に答えます。関数の3番目のパラメーターは怠inessでした。これまでのところ、sambaを備えた2番目のサーバーは計画されていないためです。 is_samba_exist関数の形式は次のとおりです。

 is_samba_exist() { smb_vol_name=$1 smbutil view //user:"$(get_inet_pwd server-pc)"@server-pc/ | awk -v smb_vol_name=$smb_vol_name '$1 == smb_vol_name {print $1}' }
      
      



関数が現在のネットワークで指定された名前のボールの存在をチェックすることは簡単に推測できます。



したがって、スクリプトの主要部分はシンプルで理解しやすく、拡張可能になりました。

 try_mount_server_samba "shara_name" "/mount/point" try_attach_fs_image "/path/to/image.sparsebundle" "/mount/point"
      
      





最後に、上記のスクリプトのイメージと似顔絵で、別のスクリプトが作成されましたが、すべてを一度にアンマウントするためのものです。

 #!/bin/sh # unmount volume if it mounted # syntax: umount_volume "/path/to/volume" umount_volume() { vol_path=$1 if [[ $(mount | awk -v vol_path=$vol_path '$3 == vol_path {print $3}') != "" ]]; then umount $vol_path echo $vol_path is unmounted fi } # detach filesystem image if it attached # syntax: detach_fs_image "/path/to/fs/image" detach_fs_image() { img_path=$1 if [[ $(df -Hl | awk -v img_path=$img_path '$9 == img_path {print $9}') != "" ]]; then hdiutil detach $img_path echo $img_path is detched fi } # main part # umnount data volume umount_volume "/data/mount/point" # firstly detach image from backup volume detach_fs_image "/backup/image/mount/point" # secondary unmount backup volume umount_volume "/backup/volume/mount/point"
      
      





以上です。 〜/ .scriptでさらにスクリプトが兄弟に持ち去られました。 .bash_profileで短いエイリアスを取得し 、sambaの支援を始めました。



見込み



将来、私の手が届くと、 SleepWatcherを使用して友人のスクリプトを作成し 、スリープから出てから入る前に実行されるようにします。 つまり、あなたの手とはまったく関係がなく、自動化が完了したということです。



PS セキュリティのための-wスイッチの同志ヘリオに感謝します。



All Articles