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(最新の自作)
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
(上記のスクリプト)
私の推測:
いいえ。これまでに試したことは次のとおりです。
setcap
は使用できません。優れた、信頼性が高く、スクリプト化可能な、オープンソースのバックアップソリューションを何年にもわたって見つけようとした後、それは法案に適合する唯一のソリューションです。 とても感謝しています!
ええ、どうやらあなたはフルディスクアクセスのことをしなければなりません: 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に直接追加できません( bash
とrestic
のバイナリはできる)。 奇数。
EDIT2:念のため、 bash
とrestic
の両方のバイナリを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.plist
のlaunchd
スクリプトに基づく)からログを確認したところ、アクセス許可エラーがまだ残っています。
残念ながら、回避策を機能させることができなくなりました。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。 どんなバックアップソフトウェアにとっても、それは私にとって大きな問題のように思えます!
いくつかの提案/可能性(私が取り組んで喜んでお手伝いします):
全体として、状況はルートなしの完全バックアップとそれほど異ならないようです
Linuxでは、SIPを完全に無効にすることは、次のように実行するようなものです。
ルート、および合理的に安全な妥協案を決定および推奨する
FDAはsetcap
を使用するようなものです。
残念ながら、私のMacbookは今週店にあるので、できなくなります
これらのいずれかにすぐに取り組みますが、私は考えを聞くことに興味があります
他の人から; おそらく私はベースから離れているか、おそらくの詳細を知らない
問題を管理するためのresticチームのワークフロー。
マシンが戻ってきたので、さらにいくつかの更新を行います。
起動したスクリプトから完全なシステムバックアップを取得する際に、上記の成功を再現することはできません。
以下のすべてを(同時に)FDAリストに追加しようとしましたが、それでもエラーが発生します。
実験のためだけに、裸のバイナリは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
編集:このコメントを無視してください-おそらく昨日の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 visudo
、 NOPASSWD:
)を使用してそのスクリプトを実行する権限をユーザーに与えることです。など)。
きれいではありませんが、機能しているようです。
より専門的な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 root
とchmod 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。
~/bin
ディレクトリにインストールされています。~/bin/restic-fda
を追加しましたrestic-fda
をインタラクティブに実行しています。 error: Open: open /Users/armhold/Library/Application Support/AddressBook: operation not permitted
のようなエラーが発生します。私は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バックアップを再実行しました。
今回はエラーなしで正常にバックアップされました(Relica + resticによって作成された最初のスナップショットは、アクセス許可エラーのためにMailフォルダーをまったく表示しませんでした):
ですから、このスレッドに貢献するための答えがないのではないかと思います。 :-/動作し続けるかどうかはわかりませんが、もちろん動作することを願っています。
私も、自分の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/bin
にrestic-backup.sh
$という名前のバックアップスクリプトがあり、アクセス許可700
です(root / sudo読み取り/書き込み/実行のみ)。 このファイルをrootcrontab sudo crontab -e
で実行します。 デフォルトの端末としてiTermを使用しています。 Homebrewでrestic
とzsh
をインストールしました。
macOSバージョン10.14.5
私のバックアップスクリプトファイルには、次のものが含まれています。
#!/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
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>
go build
gotest
バイナリ(および他には何もありません)をフルディスクアクセスに追加します~/Library/LaunchAgents/
にコピーします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 load
はsudo 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は、ホワイトリストに登録されたアプリケーション(開始とは、起動によって起動されることを意味します)、ホワイトリストに登録されていないアプリケーションの子プロセス、およびlaunchd
( launchd.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として実行せずにバックアップするセクションのように、これは例の下の新しいポイントである必要がありますか?
私は次のことに注意する予定です:
これは、みんなの理解と経験を反映しているように聞こえますか?
やや複雑ですが、私は過去1年間に2台のMacbookで実行されたセットアップに満足しており、おそらくその一部を例として含めます。 私の設定は次のとおりです。
https://github.com/restic/restic/issues/2051#issuecomment-442872479に似たバイナリを使用するとうまくいきます。 今はインストールしていないので、cを使用しました。 他の人がコピー/貼り付けする場合:
#include <stdlib.h>
int main(void) {
int status = system("./backup.sh");
int ret = WEXITSTATUS(status);
return ret;
}
gcc -Wall -o backup backup.c
不思議なことに、再起動を含め、まだ表示されています。
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
$#$で起動できます。
そして要するに:
/usr/sbin/cron
、launchd.plistで非推奨Program
またはProgramArguments
のバイナリであるlaunchd.plistを介して実行します/usr/libexec/sshd-keygen-wrapper
などを介して実行したがって、 @ n8henrieの場合、実際のバイナリを見つける必要があります。
launchdを介して物事を実行している場合、これに対処する別の方法: LaunchControlには、ホワイトリストに登録してfdautil exec
を使用してコマンドを実行できるfdautil
というヘルパーが付属しています。 LaunchControlまたはfdautil set
を介してホワイトリストに登録したコマンドのみが許可されます。
https://www.soma-zone.com/LaunchControl/FAQ.htmlに少し情報があり、アプリのヘルプウィンドウに詳細があります。
最も参考になるコメント
私は最近Resticを使い始め、ルートcrontab
sudo crontab -e
から呼び出されるcronジョブとして機能させようとしています。これにより、sudo権限でのみアクセス可能なファイルにバックアップスクリプトを含めることで、もう少し安全に感じることができます。 。 @ n8henrieとまったく同じエラーが発生していましたが、今は実用的な解決策があり、これが他の人にも機能するかどうかを知りたいと思います。最初に私のセットアップの背景を少し説明します。
/Users/myuser/bin
にrestic-backup.sh
$という名前のバックアップスクリプトがあり、アクセス許可700
です(root / sudo読み取り/書き込み/実行のみ)。 このファイルをrootcrontabsudo crontab -e
で実行します。 デフォルトの端末としてiTermを使用しています。 Homebrewでrestic
とzsh
をインストールしました。macOSバージョン10.14.5
restic-backup.sh:
私のバックアップスクリプトファイルには、次のものが含まれています。
次に、ルート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
。