Restic: MacOS Mojave:エラー:開く:...操作は許可されていません

作成日 2018年10月17日  ·  56コメント  ·  ソース: restic/restic

MacOS Mojaveのプライバシー機能は、ファイルへの制限付きアクセスを制限しているようです(少なくとも、起こっているように見えます)。アップグレード前には取得できなかったアクセス許可エラーが発生します。

MacOS 10.14

sudoで実行する:

can not obtain extended attribute com.apple.rootless for /Library/Application Support/com.apple.TCC
error: Open: open /Library/Application Support/com.apple.TCC: operation not permitted
error: open /Library/Preferences/com.apple.TimeMachine.plist: operation not permitted

...他の多くのファイル。

restic versionの出力

0.9.2(最新の自作)

どのようにしてresticを正確に実行しましたか?

Mojaveにアップグレードする前に何ヶ月も使用していたのと同じbashスクリプトを、root権限で実行します。

RESTIC_PASSWORD_FILE="/path/to/file.txt" \
HOME="/path/to/homedir" \
/usr/local/bin/restic \
    --repo sftp:myserver.local:my/repo/path \
    --option='sftp.command=ssh -p REDACTEDPORT -i REDACTEDKEYFILE -o identitiesonly=yes -l restic myserver.local -s sftp' \
    --exclude-file="${DIR}/global-exclude.txt" \
    --exclude-if-present='.norestic' \
    backup \
    --cleanup-cache \
    / \
    &>> /path/to/file.log

リポジトリを保存するためにどのバックエンド/サーバー/サービスを使用しましたか?

上記のようにsftp。 以前と同じリポジトリ。

予想される行動

うまくいけば、rootとして実行するときにすべてのファイルを読み取ってバックアップします(これは問題ではないかもしれませんが、バックアップにとっては確かに問題のようです)。

実際の動作

上記のように

動作を再現する手順

sudo bash restic-backup.sh (上記のスクリプト)

何がこれを引き起こしたのか分かりますか?

私の推測:

問題を解決する方法を知っていますか?

いいえ。これまでに試したことは次のとおりです。

  • MacOSにはlibcapがないため、 setcapは使用できません。
  • 新しい[システム環境設定]-> [セキュリティとプライバシー]ペインの[フルディスクアクセス]にresticを追加しようとしましたが、うまくいきませんでした。

Resticはあなたを助けましたか、それともあなたを幸せにしましたか?

優れた、信頼性が高く、スクリプト化可能な、オープンソースのバックアップソリューションを何年にもわたって見つけようとした後、それは法案に適合する唯一のソリューションです。 とても感謝しています!

backup documentation wanted darwin discussion

最も参考になるコメント

私は最近Resticを使い始め、ルートcrontab sudo crontab -eから呼び出されるcronジョブとして機能させようとしています。これにより、sudo権限でのみアクセス可能なファイルにバックアップスクリプトを含めることで、もう少し安全に感じることができます。 。 @ n8henrieとまったく同じエラーが発生していましたが、今は実用的な解決策があり、これが他の人にも機能するかどうかを知りたいと思います。

最初に私のセットアップの背景を少し説明します。

/Users/myuser/binrestic-backup.sh $という名前のバックアップスクリプトがあり、アクセス許可700です(root / sudo読み取り/書き込み/実行のみ)。 このファイルをrootcrontab sudo crontab -eで実行します。 デフォルトの端末としてiTermを使用しています。 Homebrewでresticzshをインストールしました。

macOSバージョン10.14.5

restic-backup.sh:

私のバックアップスクリプトファイルには、次のものが含まれています。

#!/usr/local/bin/zsh
restic_path="/usr/local/bin"
logFile="/Users/myuser/Documents/Backups/configurations/Mac/backup_logs/$(date +%F_%H%M)_restic.log"
unset HISTFILE
export RESTIC_REPOSITORY="..."
export AWS_ACCESS_KEY_I'd="..."
export AWS_SECRET_ACCESS_KEY="..."
export RESTIC_PASSWORD="..."
$restic_path/restic --verbose backup /Users/myuser  &> $logFile

次に、ルートcrontabファイルに次のように入力します。 sudo crontab -e次のようになります。

0 */2 * * * /Users/myuser/bin/restic-backup.sh

フルディスクアクセスの場合:

cron ==> /usr/sbin/cron
iTerm.app ==> /Applications/iTerm.app

@ n8henrieのように、実際にresticのようなファイルにアクセスするプログラムは、FDAを必要とするプログラムだと思いましたが、代わりに、最初のsudo要求を行うプログラムにはFDAが必要なようです: cron自動の場合はiTerm.app

全てのコメント56件

ええ、どうやらあなたはフルディスクアクセスのことをしなければなりません: https ://www.backblaze.com/blog/mojave-permissions/

正しいresticバイナリを追加しましたか? システム環境設定のフルディスクアクセスにファイルを追加した後、ファイルを移動したか、その属性(所有権など)を変更しましたか?

(私はMacを持っていますが、まだMojaveを持っていません。ごめんなさい。)

私は自作を使用しているので、最初にFull Disk Accessに/usr/local/bin/resticを追加し、ジョブを開始し、同じエラーを記録しました。次に、それを削除して、実際のバイナリへのパスを追加しました(残念ながら、これは残りの更新のたびにやり直します): /usr/local/Cellar/restic/0.9.2/bin/restic 、残念ながら同じエラーが表示されます。

変更はなく、フルディスクアクセスにバイナリを追加し、ターミナルに戻ってsudo myscript.shを実行しました。これはほとんどのファイルで機能しましたが、他のファイルではアクセス許可エラーが発生しました。

ちなみに、私が具体化しようとしている別の(おそらくMojave関連の)問題があります。launchctlから(rootとして)実行するとsftp pubkey認証が機能しなくなりましたが、rootとして手動で実行すると機能しますが、自分の設定に固有のものではないと判断できる場合は、新しい問題を提出してください。

面白い。 Resticを直接実行するとどうなりますか? および/またはスクリプトをFDAに追加します。 正直なところ、ここで暗闇の中で撮影しているだけです。 私がモハベを持っていたら、私はそれを試してみました。

良い考え。

私のスクリプト自体は実行可能ではありません(実際には理由はありません)。前述のように、 sudo bash myscript.sh (実際に/usr/local/bin/bash )で実行します。 実行可能ではないため、FDAに追加することはできません。

/usr/local/bin/bashをFDAに追加してみましたが、サイコロはありません。

編集:私は明らかに間違っています、 chmod +xの後でも、私のbackup.shまだFDAに直接追加できません( bashresticのバイナリはできる)。 奇数。

EDIT2:念のため、 bashresticの両方のバイナリをFDAに追加しましたが、同じエラーが表示されます。

おそらくresticよりも大きな問題です-FDAリストに/bin/lsを追加しようとしても、エラーが発生します。

$ sudo /bin/ls /Users/me/Library/Suggestions
ls: Suggestions: Operation not permitted

編集:醜い回避策:FDAの許可にTerminal.appを追加すると、許可のエラーがなくなります。

関連するスレッド: https ://forums.developer.apple.com/thread/107546

レスティックバイナリと私のbackup.shスクリプトの両方をcodesign試して、FDAに追加しましたが、運が悪かったです。

(そのスレッドのいくつかを読んだ後)私の良さ。 これは非常に迷惑です。 調べてくれてありがとう! アップグレードしたら、私も調査を続けます...

わあ、情報と問題に費やしてくれたすべての時間をありがとうございました! 私はMacをまったく持っていないので、両方がそれを理解してくれて、他のユーザーのためにこの問題を文書化できることをうれしく思います! ありがとうございました!

@mholt必要に応じて、VMware Fusionの30日間の試用版をインストールし、その中にMojaveをインストールできます(Appleがアドホックにインストールする機能を無効にした場合を除く)。 そのトライアルは汚染を行わず、後でそれを望まない場合はアンインストールすることができます。

System Preferences -> Security & Privacy -> Full Disk AccessリストにTerminal.appを追加すること手動でスクリプトを実行したとき( sudo /usr/local/bin/bash mybackup.sh )権限エラーなしで機能しているようです。

何らかの理由で、今朝、自動化された夜間のrestic実行(root権限で毎晩実行される/Library/LaunchDaemons/com.n8henrie.restic.plistlaunchdスクリプトに基づく)からログを確認したところ、アクセス許可エラーがまだ残っています。

残念ながら、回避策を機能させることができなくなりました。FDAでTerminal.appを使用していても、 sudo launchctl start com.n8henrie.resticまたはsudo /usr/local/bin/bash mybackup.shを実行すると、アクセス許可エラーが発生します。

そのため、回避策が機能していないように見えるか、何かが変更されています。

編集:ああ、3つすべてをFDAに追加しました- Terminal.app/usr/local/bin/bash 、および/usr/local/Cellar/restic/0.9.2/bin/restic -そして今ではエラーなしで実行されました。 🤷‍♂️

FWIW、これが私のログ出力です。これには、エラーが発生したファイルのリストが含まれています。 ご覧のとおり、私の写真ライブラリのように、いくつかの大きな懸念があります。

@ n8henrie以前にリンクしたMacサポートスレッドから、FDAは承認されたアプリをApplicationsフォルダーに登録された.appバンドルにする必要があるようです。これが、Terminal.appが成功する理由かもしれません...しかし、3つすべてを追加する必要があります。あなたの場合はFDAに? 面白い...

@mholt何か他のことが起こっているようです。 私は昨日とまったく同じように設定を残しましたが(FDAの3つすべてで、許可エラーは発生しませんでした)、夜間の実行でも同じ古い許可エラーが発生しました。

これは現在2回発生しており、しばらくいじくり回した後、パーミッションエラーなしで実行され、その後再び表示されます。 Resticは、ファイルを開かなくてもファイルが変更されたかどうかをどういうわけか知っていますか?ある種のキャッシュですか? 密接に実行された実行にだまされて、ファイルに暫定的な変更がないため、resticがファイルを開こうとしないのではないかと思います。

そうでなければ、私はここで何が起こっているのかを説明するのに苦労しています。

良い質問。 Resticがキャッシュを使用していることは知っていますが、パーミッションエラーなどの場合にキャッシュがどれほど積極的に順守するかについては調べていません。

SOでの関連する議論: https ://apple.stackexchange.com/q/338213/27415

良い質問。 Resticがキャッシュを使用していることは知っていますが、パーミッションエラーなどの場合にキャッシュがどれほど積極的に順守するかについては調べていません。

全くない。 キャッシュにはリポジトリからのファイルのみが含まれ、ファイルシステム(リポジトリにない)に関する情報は含まれません。

わかりました-ええ、これはresticのバグではないと思います。 これは間違いなくmacOSMojaveの問題であり、現時点では、restic自体は修正するために何もできないと確信しています。

かっこいい、フィードバックをありがとう、私は今のところこの問題を閉じています。 何か見つけたらコメントを追加してください。 ありがとう!

問題がすでに解決されているのを見て少し驚いています-これは
主要なプラットフォームとの主要な非互換性、およびこの時点でそれを閉じる
それを「見えない、心の外」に置くかもしれません。

これは主に問題ではないことは理解していますが、
MacOSユーザーのために取ることができるいくつかの合理的なステップがあります。 そのまま、
最も重要な個人の多くをバックアップするユーザーの能力
データ(写真など)は、現在のバージョンのデフォルトで危険にさらされています
マックOS。 どんなバックアップソフトウェアにとっても、それは私にとって大きな問題のように思えます!

いくつかの提案/可能性(私が取り組んで喜んでお手伝いします):

  • 問題を解決する可能性

    • 適切なMacOSラッパーアプリケーションを提供することは可能ですか?

      残りのバイナリを含むFDAリストに追加することができます

    • 上記を行う方法を理解できる場合は、

      アプリケーション、ユーザーがそれを達成する方法についての指示を含めることができますか

      ある種のMakefileまたはXCodeを使用していますか?

  • 回避策

    • 最も安全な/最小限のバイナリに関する情報をドキュメントに提供します

      FDAに追加する必要があります

    • SIPの無効化(およびそのリスク)に関する情報へのリンクを提供する

  • 警告

    • Mojaveユーザーが持っていない場所のドキュメントに情報を含めます

      デフォルトで完全にバックアップされたデータ

全体として、状況はルートなしの完全バックアップとそれほど異ならないようです
Linuxでは、SIPを完全に無効にすることは、次のように実行するようなものです。
ルート、および合理的に安全な妥協案を決定および推奨する
FDAはsetcapを使用するようなものです。

残念ながら、私のMacbookは今週店にあるので、できなくなります
これらのいずれかにすぐに取り組みますが、私は考えを聞くことに興味があります
他の人から; おそらく私はベースから離れているか、おそらくの詳細を知らない
問題を管理するためのresticチームのワークフロー。

マシンが戻ってきたので、さらにいくつかの更新を行います。

起動したスクリプトから完全なシステムバックアップを取得する際に、上記の成功を再現することはできません。

以下のすべてを(同時に)FDAリストに追加しようとしましたが、それでもエラーが発生します。

  • レスティック
  • bash
  • launchctl
  • ローンチ
  • Terminal.app

実験のためだけに、裸のバイナリはFDAリストに追加されたときに正常に機能するようであり、コード署名とは何の関係もないようです。 MacOSとHomebrewが提供するlsバイナリを比較します。

$ codesign -d /bin/ls
Executable=/bin/ls
$ codesign -d /usr/local/opt/coreutils/libexec/gnubin/ls
/usr/local/opt/coreutils/libexec/gnubin/ls: code object is not signed at all

FDAリストに追加する前と追加:

$ /bin/ls ~/Library/Mail
ls: Mail: Operation not permitted
$ /usr/local/opt/coreutils/libexec/gnubin/ls ~/Library/Mail
ls: cannot open directory '/Users/n8henrie/Library/Mail': Operation not permitted
$ # Added to FDA
$ /bin/ls ~/Library/Mail
PersistenceInfo.plist V6
$ /usr/local/opt/coreutils/libexec/gnubin/ls ~/Library/Mail
PersistenceInfo.plist  V6

さらに、 lsがFDAにある限り( bashを個別に追加する必要はありません)、bashスクリプトに入れると正常に機能するため、 resticを追加するだけでよいと思います。

また、比較のために、FDAにない場合は、次のGoスクリプトエラーを実行しますが、バイナリがFDAにある限り、launchdから呼び出された場合と同様に正常に動作します(launchd / launchctl /その他を追加する必要はありません)。

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    matches, err := ioutil.ReadDir("/Users/n8henrie/Library/Mail")
    if err != nil {
        fmt.Println("Err:", err)
    } else {
        for _, match := range matches {
            fmt.Println(match.Name())
        }
    }
}

出力:

$ ./gotest
Err: open /Users/n8henrie/Library/Mail: operation not permitted
$ # Add to FDA
$ ./gotest
.DS_Store
PersistenceInfo.plist
V6

次に、Resticを試して、FDAに追加した場合でも許可エラーが発生する理由を理解できるかどうかを確認します(ただし、他のバイナリは追加すると機能しているようです)。

フィードバックありがとうございます。 この問題を再開します。何が起こっているのかを理解してから、マニュアルにドキュメントを追加できるかもしれません。

〜新しいリポジトリでOpenエラーが発生し、 resticがFDAリストに追加されます。〜

以下の編集を参照してください。

$ restic -r /tmp/restic backup ~/Library/Mail -vvv
open repository
enter password for repository:
repository 9ccb5357 opened successfully, password is correct
created new cache in /Users/me/Library/Caches/restic
lock repository
load index files
start scan on [/Users/me/Library/Mail]
start backup on [/Users/me/Library/Mail]
scan: Open: open /Users/me/Library/Mail: operation not permitted
scan finished in 1.849s: 0 files, 0 B
can not obtain extended attribute com.apple.quarantine for /Users/me/Library/Mail:
error: Open: open /Users/me/Library/Mail: operation not permitted
new       /Users/me/Library/, saved in 0.012s (0 B added, 13 B metadata)
new       /Users/me/, saved in 0.012s (0 B added, 381 B metadata)
new       /Users/, saved in 0.013s (0 B added, 379 B metadata)

Files:           0 new,     0 changed,     0 unmodified
Dirs:            3 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      4 new
Added to the repo: 1.119 KiB

processed 0 files, 0 B in 0:01
snapshot 4a658c73 saved
$ restic -r /tmp/restic ls latest
enter password for repository:
repository 9ccb5357 opened successfully, password is correct
snapshot 4a658c73 of [/Users/me/Library/Mail] filtered by [] at 2018-11-04 11:30:05.334024 -0700 MST):
/Users
/Users/me
/Users/me/Library

screenshot 2018-11-04 at 11 32 18 am

編集:このコメントを無視してください-おそらく昨日のMacOS 10.14.1へのアップデートに関連して、進行を混乱させる断続的なエラーにまだ悩まされています。 今日、FDAで一貫して機能し、それなしで失敗した(確かに何度もオンとオフを切り替えた)昨日の同じGoコードは、 FDAでも機能しなくなりました。 lsと同じです。

Terminal.appが(唯一のエントリとして)FDAに追加された場合は機能しますが、昨日は必要ありませんでした。

🤷‍♂️

Appleフォーラムでこれについて何か見つけたら、報告します。

EDIT2:妻のMacbookはまだ10.14であり、 /bin/ls ~/Library/MailはFDAに追加された/bin/lsでは機能しないため、10.14.1では新しいものではないようです。 😕

まだこれに取り組んでいます。

それはかなり苦痛なままですが、私は最終的に私の目的のために働くと思う回避策を持っています。

ここでプロセスの詳細を説明しましたが、要点は次のとおりです。

Script Editor.appを使用して、AppleScriptをアプリケーションバンドルにすることができます。 そのAppleScriptはあなたのresticバックアップスクリプト(私の場合/path/to/restic-backup.sh 、ここでrestic-backup.shは私の希望する設定でresticを実行するbashスクリプトです)を実行でき、結果のアプリケーションバンドルをFDAに追加できます保護されたファイルにアクセスするため。

ただし、これにより、システムレベルでのバックアップの実行を自動化することが困難になります。 組み込みのopenコマンドは機能しますが、ユーザーの下でアプリケーションを実行します。そのため、上記のFDAで保護されたファイルはバックアップされますが、rootでのみ読み取り可能なファイル(rootなど)でアクセス許可エラーが発生します。 -0600のものを所有)。

この時点での私の回避策は、AppleScriptにsudoを使用してバックアップスクリプトを呼び出し、パスワードなしでroot権限( sudo visudoNOPASSWD: )を使用してそのスクリプトを実行する権限をユーザーに与えることです。など)。

きれいではありませんが、機能しているようです。

より専門的なMacOSユーザーからの提案のためにこれを開いたままにしておきたいと思います。 これ以上満足できるものがない場合は、この情報をドキュメントに追加できます(ただし、このソリューションは正直なところ、あまり満足のいくものではないようです)。

信じられないほど、これはうまくいくようで、はるかにクリーンでシンプルです。

// Runrestic provides a binary to run my restic backup script in MacOS Mojave with Full Disk Access
package main

import (
    "log"
    "os"
    "os/exec"
    "path/filepath"
)

func main() {
    ex, err := os.Executable()
    if err != nil {
        log.Fatal(err)
    }
    dir := filepath.Dir(ex)
    script := filepath.Join(dir, "restic-backup.sh")
    cmd := exec.Command("/usr/local/bin/bash", script)
    if err := cmd.Run(); err != nil {
        log.Fatal(err)
    }
}

結果のバイナリはchown rootchmod 0700になり、フルディスクアクセスに追加できます。これは機能しているようです。 その後、 /Library/LaunchDaemons plistに追加して、自動的に実行できます。

これまでのところ、最初の2回の実行が機能しています。これが、上記のいくつかの誤った開始のように終わらないことを願っています。

昨夜の自動実行はうまくいきました。 私は今日、この戦略を妻のMacbook Airに展開しています。そこでも機能するようであれば、これは妥当な修正と見なし、 https://github.com/restic/resticへの小さなPRに取り組みます。ネット(それが合理的と思われる場合)。

こんにちは@ n8henrie 、私はこの正確な問題にぶつかり、あなたのブログ投稿を見つけた後にここに来ました。 このすべての研究をしてくれてありがとう。

上記の解決策(単純なGoバイナリからシェルスクリプトを呼び出す)は私には機能しません。 すべてのファイルに正常にアクセスしていますか?

特に、stdout / stderrが/ dev / nullに破棄されていることに気付きました。 また、たとえば、resticがパスワードの入力を求めている場合、stdinを読み取ることはできません。 (また、ちょっとおかしいですが、なぜあなたのbashは/bin/bash /usr/local/bin/bash $なのですか?ただ好奇心が強いです。)

とにかく、エラー出力を確認するために次の変更を行いました。

    cmd := exec.Command("/bin/bash", script)
    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

あなたのブログ投稿を見る前の私の最初の本能は、レスティックバイナリ自体をFDAに追加することでしたが、10.14.1(18B75)では機能しませんでした。 別のプログラム(シェルスクリプトを呼び出すGoラッパー、最終的にはresticを呼び出す)を挿入すると、何かが変わる理由がわかりません。

これはまだあなたのために働いていますか?

@ n8henrie投稿してくれてありがとう! あなたがそれを望んでいるなら、あなたはそれについてのブログ投稿をresticブログに書くこともできます(マニュアルの小さなセクションに加えて)... :)

@ fd0光栄です!

@armholdはい、チャームのように機能しているようです。以下を参照してください。 妻のMBAでは、動作を開始する前に再起動が必要だったと思います(私の場合はそうではありません)。 彼女のためのIIRC、私はバイナリを作成し、再起動し、そしてFDAに追加しました、そしてそれは機能しました。

修正前:

Thu Nov 15 02:00:00 MST 2018 :: Starting restic-backup.sh
can not obtain extended attribute com.apple.rootless for /Library/Application Support/com.apple.TCC:
error: Open: open /Library/Application Support/com.apple.TCC: operation not permitted
error: open /Library/Preferences/com.apple.TimeMachine.plist: operation not permitted
error: Open: open /Users/me/Library/Application Support/AddressBook: operation not permitted
error: Open: open /Users/me/Library/Application Support/CallHistoryDB: operation not permitted
error: Open: open /Users/me/Library/Application Support/CallHistoryTransactions: operation not permitted
error: Open: open /Users/me/Library/Application Support/MobileSync: operation not permitted
error: Open: open /Users/me/Library/Application Support/com.apple.TCC: operation not permitted
error: Open: open /Users/me/Library/Calendars: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.Home: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.Safari: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.VoiceMemos: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.iChat: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.mail: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.news: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.stocks: operation not permitted
can not obtain extended attribute com.apple.quarantine for /Users/me/Library/Cookies:
error: Open: open /Users/me/Library/Cookies: operation not permitted
error: Open: open /Users/me/Library/HomeKit: operation not permitted
error: Open: open /Users/me/Library/IdentityServices: operation not permitted
can not obtain extended attribute com.apple.quarantine for /Users/me/Library/Mail:
error: Open: open /Users/me/Library/Mail: operation not permitted
error: Open: open /Users/me/Library/Messages: operation not permitted
error: Open: open /Users/me/Library/Metadata/CoreSpotlight: operation not permitted
error: Open: open /Users/me/Library/Metadata/com.apple.IntelligentSuggestions: operation not permitted
can not obtain extended attribute com.apple.metadata:com_apple_backup_excludeItem for /Users/me/Library/PersonalizationPortrait:
error: Open: open /Users/me/Library/PersonalizationPortrait: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.AddressBook.plist: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.AddressBook.plist.KaSTvBv: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.AddressBook.plist.M410OmB: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.AddressBook.plist.Sjhd5Xh: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.AddressBook.plist.ceAM0im: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.homed.notbackedup.plist: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.homed.plist: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.mail-shared.plist: operation not permitted
error: Open: open /Users/me/Library/Safari: operation not permitted
can not obtain extended attribute com.apple.metadata:com_apple_backup_excludeItem for /Users/me/Library/Suggestions:
error: Open: open /Users/me/Library/Suggestions: operation not permitted
can not obtain extended attribute com.apple.FinderInfo for /Users/me/Pictures/Photos Library.photoslibrary:
can not obtain extended attribute com.apple.quarantine for /Users/me/Pictures/Photos Library.photoslibrary:
error: Open: open /Users/me/Pictures/Photos Library.photoslibrary: operation not permitted

Files:         179 new,   261 changed, 857338 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Added to the repo: 266.392 MiB

processed 857778 files, 186.192 GiB in 12:57
snapshot 46831f24 saved
Thu Nov 15 02:12:58 MST 2018 :: restic-backup.sh finished.
Duration: 778 seconds

修正後:

Tue Nov 27 02:00:00 MST 2018 :: Starting restic-backup.sh

Files:         389 new,  2367 changed, 1055845 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Added to the repo: 430.279 MiB

processed 1058601 files, 295.471 GiB in 18:16
snapshot e58d8f1c saved
Tue Nov 27 02:18:17 MST 2018 :: restic-backup.sh finished.
Duration: 1097 seconds

同じ修正が私の妻のMacbookAirでも機能しており、どちらもリモートでrestic find '/Users/*/Library/Mail' --snapshot latest --host=$(hostname)で検証されています(上記のエラーのログに見られるように、 ~/Library/Mailは通常保護されているディレクトリの1つです) 。

特に、stdout / stderrが/ dev / nullに破棄されていることに気付きました。 また、たとえば、resticがパスワードの入力を求めている場合、stdinを読み取ることはできません。

これは完全にスクリプトに依存します。 元の投稿でわかるように、セットアップは完全に自動化されているため、(ルート所有の0600)ファイルからパスワードを読み取るようにセットアップされていますが、envvarまたは通常の方法から読み取ることもできます。 そうです、これはインタラクティブなものでは機能しないと思います。 また、すべてをファイル&>> /path/to/file.logに記録します。

(また、ちょっとおかしいですが、なぜあなたのbashは/ bin / bashではなく/ usr / local / bin / bashなのですか?ただ興味があります。)

私はHomebrewを使用してbashの最新バージョンを入手しています

$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
$ /usr/local/bin/bash --version
GNU bash, version 4.4.23(1)-release (x86_64-apple-darwin17.5.0)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

これにより、 &>file.log演算子( 2>&1 >file.logと比較して数回のキーストロークを節約できる)などのより最新の機能が得られます。

あなたのブログ投稿を見る前の私の最初の本能は、レスティックバイナリ自体をFDAに追加することでしたが、10.14.1(18B75)では機能しませんでした。 別のプログラム(シェルスクリプトを呼び出すGoラッパー、最終的にはresticを呼び出す)を挿入すると、何かが変わる理由がわかりません。

私もこれについて完全にはわかりません。 私のユースケースでは、bashスクリプトで行う他の多くの設定があります(宛先、バックアップパス、およびいくつかのオプションがホスト名に基づいている、やや複雑なsftpコマンド)ので、resticバイナリ自体を呼び出すことはできませんでしたオプション。 少し実験することができます。

OK、説明ありがとうございます。 再構築、再起動、FDAの追加を試しましたが、それでもoperation not permittedが表示されます。 また、バイナリラッパーとシェルスクリプトの両方を/ Applicationsに移動しようとしましたが、うまくいきませんでした。 掘り続けます。

は。 間違いなく/ Applicationsにある必要はありません。

10.14または10.14.1を使用していますか? 私は後者にいます。

また、参照したtccutilコマンドを使用して、事前にすべてのエントリをクリアしてみてください。

私は10.14.1(18B75)を使用しています。 私もtccutilコマンドを試しましたが、運が悪かったです。 Appleがこれを行っている理由は理解しているが、ここで何をすべきかについて明確な道筋がないのは本当に苛立たしいことだ。

は。 これは奇妙です。

奇妙なことに、試してみましたが、resticバイナリを直接動作させることができません。

これが機能しない理由は不明ですが、私の回避策は(私にとって)です。

別の断続的なエラーのようです-私たちは延期する必要があると思います
他の誰かを入手できるようになるまでの正式な文書化/記述
同じシステムで動作するコンピューター。 私は2対2ですが、理由がわかりません
これは@armholdでは機能しません。

@armhold 、正確なbashスクリプトとGoコードのコピーを投稿できますか
使用し、どのように実行していますか? 自分の側で再現できるかどうかを確認します。

奇妙なことに、試してみましたが、resticバイナリを直接動作させることができません。

ええ、それは私が理解していないことです。 Resticバイナリ自体が失敗するのにGoラッパーが成功する理由がわかりません。 何かがおかしいようです。

使用している正確なbashスクリプトとGoコードのコピーと、それをどのように実行しているかを投稿できますか?

確かに、ここにあります: https://github.com/armhold/restic-fda。

  • シェルスクリプトとgoラッパーの両方が私の~/binディレクトリにインストールされています。
  • システム環境設定を介してFDAに~/bin/restic-fdaを追加しました
  • ターミナルのコマンドラインで、root以外のユーザーアカウントからrestic-fdaをインタラクティブに実行しています。 error: Open: open /Users/armhold/Library/Application Support/AddressBook: operation not permittedのようなエラーが発生します。
  • rootとして実行(sudo経由)も同様に失敗します

私はlaunchctlを介してそれを実行しようとしませんでした。

ファイアウォールであるLittleSnitchも同様のことを行います。発信接続の場合、「Terminal viarestic」が接続を確立することを許可するかどうかを尋ねます(単にresticではありません)。 つまり、Terminal.appが許可を与える主要なものです。

最終的に私がしたことは、 Platypusを使用してシェルスクリプトをアプリとしてバンドルし、その生成されたアプリにFDAを付与することでした。 次に、Finderを介してバックアップを起動します。 これまでのところ動作します。

launchctlが次のステップになります。

参考までに、これはまだ私のために働いています(最新のMacOSの後を含む)
アップデート)。 @armholdからのニュースはありますか?

それでも私にはうまくいきません。 私はあきらめて、ターミナルFDAを与えました。

残念ながら、私は再び困惑しています。

私は10.14.2を使用しています。 私のresticバックアップスクリプトはまだ機能しており、ログに権限エラーはありません。 ただし、 @ armholdのスクリプトまたは以前のテストスクリプトを機能させることができなくなりました(保護されたディレクトリ~/Library/Mailを開くだけです)。

🤷‍♂️

新しいリポジトリで(動作中の)ラッパーを実行してみましたか? つまり、古いファイルをスキップしていないので、リポジトリにすでに存在しているのでしょうか。 しかし、resticがツリーを歩いているときに、保護されたフォルダに降りようとするとエラーが発生することを想像します。

@mholtこれとrelicaの状況はどうですか?どういうわけかそれを回避しましたか?もしそうなら、あなたがそうするためにどのようなステップを踏むかを私たちと共有できますか?

いくつかのクライアントをアップグレードした後、私もこの動作を目にしました。非常に煩わしく、物を包んだり、いじったりせずに対処するのは困難です。

@rawtaz

これとレリカの状況はどうですか?どういうわけかそれを回避しましたか?もしそうなら、あなたがそうするためにどのようなステップを踏むかを私たちと共有できますか?

先週、自分でMojaveにアップグレードしただけです。 しかし、Relicaをインストールして、〜/ Library / Mailをバックアップしようとすると、「操作が許可されていません」というエラーを再現できました。

次に、FDA画面にRelica.appを追加し、Relicaバックアップを再実行しました。

screen shot 2018-12-27 at 1 54 49 pm

今回はエラーなしで正常にバックアップされました(Relica + resticによって作成された最初のスナップショットは、アクセス許可エラーのためにMailフォルダーをまったく表示しませんでした):

screen shot 2018-12-27 at 1 51 31 pm

ですから、このスレッドに貢献するための答えがないのではないかと思います。 :-/動作し続けるかどうかはわかりませんが、もちろん動作することを願っています。

私も、自分のresticバックアップスクリプトを.appバンドルでラップして、FDAに提供できるようにすることに決めました。 これをしなければならないのは面倒ですが、それが唯一の実用的な方法のようです。

最初は、resticのバイナリFDAだけを提供しようとしましたが、うまくいきませんでした。
また、バックアップスクリプト(resticを呼び出すBashスクリプト)をFDAに渡してみましたが、それも機能しませんでした。
@armholdのラッパーは試しませんでした。

私は上記のようにカモノハシを使用しました、そしてそれは素晴らしい働きをします。 それは私がmacOSのシステム設定でFDAに与えることができる.appバンドルを生成します、そしてこれは問題を解決します。

使用中に気付いた唯一の欠点は、.appが起動すると(私にとってopen -ga ~/Applications/Backup.appを使用してcrontabで起動され、現在のウィンドウがフォーカスを失うことです。これはユーザーにとって深刻な迷惑になる可能性がありますが、少なくとも、バックアップは再び機能しています。 -gスイッチで問題が解決すると思いましたが、残念ながら何も変わりません。

.appバンドルを削除して(ゴミ箱に移動し、ゴミ箱を空にする)、同じ名前の新しい.appバンドルに置き換えるとどうなるかを簡単に確認しました。 私の観察では、古いものを削除すると、システム環境設定のFDAのエントリは消えますが、新しいものを同じ場所に戻すと、エントリが再び表示され、システムが新しい.appを認識して検討することを示します。 FDAを持つこと。 しかし、その後新しいアプリを実行すると、元のエラーが返されました。 システム環境設定でアプリのFDAエントリを削除し、新しいFDAエントリを追加すると、エラーは再びなくなりました。 したがって、今のところ、.appバンドルを置き換えるときは、FDAエントリも置き換える必要があると思います。 .appバンドルの一部を交換するだけでも、機能し続ける可能性があります。 これには、さらに調査が必要です。

Resticを.appバンドルにバンドルしたい人のために、いくつかの設定を変更して自分の方法: https ://medium.com/@mattholt/packaging -a-go-application-for-macos-f7084b00f6b5

10.14.3--バイナリのみで実行することについてはまだ良いニュースはありません。

$ /bin/ls ~/Library/Mail/
ls: : Operation not permitted

Terminal.appがFDAに追加された場合に機能しますが、 ls (または他のバイナリ)だけでは機能しません。

applescript / automatorは機能しますが、ドックにアイコンが表示されます。 または、xcode / swift cliを使用して、これをバイナリにコンパイルし、FDAに追加します( /full/path/toを実際のパスに置き換えます)

import Foundation
import os

let task = Process()

task.launchPath = "/full/path/to/bash"
task.arguments = ["/full/path/to/backup_script.sh"]

do{
    try task.run()
}
catch{
    os_log("error")
}

task.waitUntilExit()

@daviehhここでは運がありません。

import Foundation
import os

let task = Process()

task.launchPath = "/bin/ls"
task.arguments = ["/Users/me/Library/Mail"]

do{
    try task.run()
}
catch{
    os_log("error")
}

task.waitUntilExit()
$ swiftc foo.swift
$ ./foo
ls: Mail: Operation not permitted
$ # add to FDA
$ ./foo
ls: Mail: Operation not permitted
$ sudo ./foo
ls: Mail: Operation not permitted

私は最近Resticを使い始め、ルートcrontab sudo crontab -eから呼び出されるcronジョブとして機能させようとしています。これにより、sudo権限でのみアクセス可能なファイルにバックアップスクリプトを含めることで、もう少し安全に感じることができます。 。 @ n8henrieとまったく同じエラーが発生していましたが、今は実用的な解決策があり、これが他の人にも機能するかどうかを知りたいと思います。

最初に私のセットアップの背景を少し説明します。

/Users/myuser/binrestic-backup.sh $という名前のバックアップスクリプトがあり、アクセス許可700です(root / sudo読み取り/書き込み/実行のみ)。 このファイルをrootcrontab sudo crontab -eで実行します。 デフォルトの端末としてiTermを使用しています。 Homebrewでresticzshをインストールしました。

macOSバージョン10.14.5

restic-backup.sh:

私のバックアップスクリプトファイルには、次のものが含まれています。

#!/usr/local/bin/zsh
restic_path="/usr/local/bin"
logFile="/Users/myuser/Documents/Backups/configurations/Mac/backup_logs/$(date +%F_%H%M)_restic.log"
unset HISTFILE
export RESTIC_REPOSITORY="..."
export AWS_ACCESS_KEY_I'd="..."
export AWS_SECRET_ACCESS_KEY="..."
export RESTIC_PASSWORD="..."
$restic_path/restic --verbose backup /Users/myuser  &> $logFile

次に、ルートcrontabファイルに次のように入力します。 sudo crontab -e次のようになります。

0 */2 * * * /Users/myuser/bin/restic-backup.sh

フルディスクアクセスの場合:

cron ==> /usr/sbin/cron
iTerm.app ==> /Applications/iTerm.app

@ n8henrieのように、実際にresticのようなファイルにアクセスするプログラムは、FDAを必要とするプログラムだと思いましたが、代わりに、最初のsudo要求を行うプログラムにはFDAが必要なようです: cron自動の場合はiTerm.app

私は何か便利なものを発見しました。アプリをホワイトリストに登録すると、アプリのディレクトリ内のすべてのスクリプトまたはバイナリに適用されます。 したがって、アプリを直接起動する必要はありません。 実際、アプリ自体は完全に無関係です。ホワイトリストのコンテナとして機能するだけです。 スクリプトを任意のアプリにコピーし、そのアプリをホワイトリストに登録してから、スクリプトを実行できます。 唯一の注意点は、スクリプトまたはバイナリ内のスクリプトを変更するたびに、アプリを削除してホワイトリストに再度追加する必要があることです。

@atticusmatticus @ russelldavis-最近のMacOSアップデートの1つがまた何かを変えたかもしれないと思う-私は運が悪かったので、これらの戦略の両方を間違いなく試した。 しかし、私は以下も試しましたが、これは機能しなくなりましたが、現在は再び機能しています(一種):

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    fmt.Println("Starting...")
    matches, err := ioutil.ReadDir("/Users/me/Library/Mail")
    if err != nil {
        fmt.Println("Err:", err)
    } else {
        for _, match := range matches {
            fmt.Println(match.Name())
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.me.gotest</string>
        <key>ProgramArguments</key>
        <array>
            <string>/Users/me/go/src/github.com/me/gotest/gotest</string>
        </array>
        <key>StartInterval</key>
        <integer>15</integer>
        <key>StandardErrorPath</key>
        <string>/Users/me/go/src/github.com/me/gotest/stderr.txt</string>
        <key>StandardOutPath</key>
        <string>/Users/me/go/src/github.com/me/gotest/stdout.txt</string>
    </dict>
</plist>
  1. go build
  2. gotestバイナリ(および他には何もありません)をフルディスクアクセスに追加します
  3. plistを~/Library/LaunchAgents/にコピーします
  4. launchdデーモンをロードします: launchctl load -w ~/Library/LaunchAgents/com.me.gotest.plist

不思議なことに、 gotestバイナリが launchd (またはlaunchctl )がFDAに追加されていないので、直接実行することはできません。

$ ls -l gotest
-rwxr-xr-x 1 me staff 2142552 Jul  2 09:15 gotest
$ ./gotest
Starting...
Err: open /Users/me/Library/Mail: operation not permitted
$ sudo ./gotest
Password:
Starting...
Err: open /Users/me/Library/Mail: operation not permitted

ただし、rootとして実行されていないlaunchdデーモン(構成されている場合は15秒ごと)からエラーなしで実行されています( ~/Library//Library/ではなく、 launchctl loadsudo launchctl loadではありません)

$ cat stdout.txt | head
Starting...
.DS_Store
PersistenceInfo.plist
V6
Starting...
.DS_Store
PersistenceInfo.plist
V6
Starting...
.DS_Store

不思議なことに、再起動を含め、まだ表示されています。

|| FDAでバイナリに移行| FDAではなくバイナリに移行
--- |:---:|:---:
sudoなしでバイナリに移行| err | err
sudoでバイナリに移行| err | err
実行中のgobinary | RUNS | errを起動しました

直接関連するレスティックではなく、FDAの問題に関連しています。
私はそれがおそらくどのように機能しているかについての考えを持っていると思います、そして私は私がキャプテンであることが明白ではないことを望みます。 私はまだ、役立つディスカッション、記事、またはドキュメントを見つけることができませんでした。

FDAは、ホワイトリストに登録されたアプリケーション(開始とは、起動によって起動されることを意味します)、ホワイトリストに登録されていないアプリケーションの子プロセス、およびlaunchdlaunchd.plist )によって直接起動された場合のホワイトリストに登録されたバイナリに対して機能します。 launchctl submit )。 ホワイトリストに登録されたバイナリが、ホワイトリストに登録されていない親アプリケーション/バイナリを使用してプロセスツリーで起動された場合は機能しません。

このことから、ホワイトリストに登録されたアプリケーション/バイナリに応じてプロセスツリーをホワイトリストに登録するのはlaunchdのようです。

実験から、バイナリへのパスは正確である必要があるように見えるため、ホワイトリストに登録されたバイナリのlaunchctl plistにWorkingDirectoryが指定されていて、相対パス./some-binaryが使用されている場合、ホワイトリストはトリガーされません。 /some/path/./some-binaryまたは/some/path/../path/some-binaryの場合、 /some/path/some-binaryのみ。
また、スクリプトをlaunchdで直接起動しても、ホワイトリストに登録されたアプリケーションをshebangに使用することはできないため、 #!/some/path/some-binaryは機能せず、 /some/path/some-binary /path/to/scriptのみが機能します。

ドキュメントに少なくともいくつかのガイドライン(およびおそらくこの問題へのリンク)を提供するのに十分な情報とデータポイントがあると思います。それでよければ、作業を開始したいと思います。

Linuxでrootとして実行せずにバックアップするセクションのように、これはの下の新しいポイントである必要がありますか?

私は次のことに注意する予定です:

  • できるだけ多くのディスクをバックアップするには、フルディスクアクセスが必要です
  • rootとして実行されているlaunchdスクリプトは、FDAにlaunchdを追加しなくても、FDAの下でホワイトリストに登録されているバイナリを呼び出すことができます。
  • Terminal.appがFDAにリストされていない限り、ターミナルから呼び出されたときにバイナリはディスク全体にアクセスできません
  • Terminal.appがFDAにリストされている場合、そのバイナリがFDAにあるかどうかに関係なく、バイナリを呼び出すときにディスク全体にアクセスできます。

これは、みんなの理解と経験を反映しているように聞こえますか?

やや複雑ですが、私は過去1年間に2台のMacbookで実行されたセットアップに満足しており、おそらくその一部を例として含めます。 私の設定は次のとおりです。

  • さまざまな環境変数に基づいてマシン固有のresticコマンドを実行するシェルスクリプトがあります(同じスクリプトは、このスクリプトを直接呼び出す4台のLinuxコンピューターでも実行されます)。
  • 私のMacOSコンピュータでは、基本的に上記のシェルスクリプトを実行するだけのgoバイナリを作成します。 ここでは、設定/更新/バージョン管理を簡単にするためにシェルスクリプトを使用していますが、これはGoで直接行うこともできます。
  • このバイナリはFDAに追加されます
  • システム全体のlaunchdデーモン(root権限で実行)を実行して、このgoバイナリをスケジュールに従って起動します

https://github.com/restic/restic/issues/2051#issuecomment-442872479に似たバイナリを使用するとうまくいきます。 今はインストールしていないので、cを使用しました。 他の人がコピー/貼り付けする場合:

  1. backup.c
#include <stdlib.h>
int main(void) {
  int status = system("./backup.sh");
  int ret = WEXITSTATUS(status);
  return ret;
}
  1. コンパイル: gcc -Wall -o backup backup.c
  2. バックアップバイナリをホワイトリストに登録し、好きなように使用します

不思議なことに、再起動を含め、まだ表示されています。

FDAでバイナリに移行するFDAではなくバイナリに移行する
sudoなしでバイナリに移行エラーエラー
sudo errerrでバイナリに移動します
launchd running go binary RUNS err

ありがとう!

私にとっての解決策は、resticを直接呼び出す.plistファイルを作成し、-p、-exclude-files、-files-fromオプションを使用して、すべてのパラメーターを内部または個別のファイルに配置することでした。 そしてもちろん、resticバイナリFDA許可を与えます:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>my.backup_agent</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/restic</string>
        <string>backup</string>

        <string>-r</string>
        <string>s3:https://MY.STORAGE.SERVER/....</string>

        <string>-p</string>
        <string>.config/backup/restic.pwd</string>

        <string>--files-from</string>
        <string>.config/backup/backup.lst</string>

        <string>--exclude-file</string>
        <string>.config/backup/exclude.lst</string>
    </array>

    <key>EnvironmentVariables</key>
    <dict>
        <key>AWS_ACCESS_KEY_ID</key>
        <string>XXX</string>

        <key>AWS_SECRET_ACCESS_KEY</key>
        <string>YYY</string>
    </dict>

    <key>WorkingDirectory</key>
    <string>/Users/ME</string>

    <key>StandardErrorPath</key>
    <string>/Users/ME/log/backup.log</string>

    <key>StandardOutPath</key>
    <string>/Users/ME/log/backup.log</string>

    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>13</integer>

        <key>Weekday</key>
        <array>
        <integer>1</integer>
        <integer>2</integer>
        <integer>3</integer>
        <integer>4</integer>
        <integer>5</integer>
        </array>
    </dict>
</dict>
</plist>

どのアプリをFDAに追加する必要があるかを見つける方法は? つまり、アプリがそれを実行していることを確認します。

プロセスを実行し続け、祖先pidが1になるまでプロセスの親pidをウォークし、 ps ajxまたはps ao pid,ppid,commandを介して$#$ grep $#$で起動できます。

そして要するに:

  • crontabを介して実行、 /usr/sbin/cron 、launchd.plistで非推奨
  • ProgramまたはProgramArgumentsのバイナリであるlaunchd.plistを介して実行します
  • Terminal、Terminal.appで実行
  • ssh、 /usr/libexec/sshd-keygen-wrapperなどを介して実行
  • 他のアプリを介して実行し、それを見つけます。

したがって、 @ n8henrieの場合、実際のバイナリを見つける必要があります。

launchdを介して物事を実行している場合、これに対処する別の方法: LaunchControlには、ホワイトリストに登録してfdautil execを使用してコマンドを実行できるfdautilというヘルパーが付属しています。 LaunchControlまたはfdautil setを介してホワイトリストに登録したコマンドのみが許可されます。

https://www.soma-zone.com/LaunchControl/FAQ.htmlに少し情報があり、アプリのヘルプウィンドウに詳細があります。

このページは役に立ちましたか?
0 / 5 - 0 評価