Restic: MacOS Mojave: ์˜ค๋ฅ˜: ์—ด๊ธฐ: ... ์ž‘์—…์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 10์›” 17์ผ  ยท  56์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: restic/restic

MacOS Mojave์˜ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ๊ธฐ๋Šฅ์€ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ œํ•œ์ ์ธ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(์ตœ์†Œํ•œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒฝ์šฐ). ์—…๊ทธ๋ ˆ์ด๋“œ ์ „์— ๋ฐ›์ง€ ๋ชปํ•œ ๊ถŒํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋งฅOS 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 ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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. ์ด์ „๊ณผ ๋™์ผํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ.

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

๋ฃจํŠธ๋กœ ์‹คํ–‰ํ•  ๋•Œ ๋ชจ๋“  ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ฐฑ์—…ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์‹ค์ œ ํ–‰๋™

์œ„์™€ ๊ฐ™์ด

ํ–‰๋™์„ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„

sudo bash restic-backup.sh (์œ„ ์Šคํฌ๋ฆฝํŠธ)

์ด ๋ฌธ์ œ์˜ ์›์ธ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ถ”์ธก:

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์˜ค. ์ง€๊ธˆ๊นŒ์ง€ ์‹œ๋„ํ•œ ๊ฒƒ:

  • MacOS์—๋Š” libcap์ด ์—†์œผ๋ฏ€๋กœ setcap ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ์„ค์ • -> ๋ณด์•ˆ ๋ฐ ๊ฐœ์ธ ์ •๋ณด ์ฐฝ์—์„œ "์ „์ฒด ๋””์Šคํฌ ์•ก์„ธ์Šค"์— ์ œํ•œ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์šด์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

restic์ด ๋‹น์‹ ์„ ๋„์™”๊ฑฐ๋‚˜ ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๋‹น์‹ ์„ ํ–‰๋ณตํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๊นŒ?

ํ›Œ๋ฅญํ•˜๊ณ  ์•ˆ์ •์ ์ด๋ฉฐ ์Šคํฌ๋ฆฝํŒ… ๊ฐ€๋Šฅํ•œ ์˜คํ”ˆ ์†Œ์Šค ๋ฐฑ์—… ์†”๋ฃจ์…˜์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ˆ˜๋…„๊ฐ„ ๋…ธ๋ ฅํ•œ ๋์— ์ด ์†”๋ฃจ์…˜์ด ๋”ฑ ๋งž๋Š” ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

backup documentation wanted darwin discussion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ €๋Š” ์ตœ๊ทผ์— Restic์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ๋ฃจํŠธ crontab sudo crontab -e ์—์„œ ํ˜ธ์ถœ๋œ cron ์ž‘์—…์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•˜์—ฌ sudo ๊ถŒํ•œ์œผ๋กœ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ์˜ ๋ฐฑ์—… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ๋” ์•ˆ์ „ํ•˜๋‹ค๊ณ  ๋Š๋‚„ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. . @n8henrie ์™€ ๋˜‘๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ์ด์ œ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ์ ์šฉ๋˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๋‚ด ์„ค์ •์˜ ์•ฝ๊ฐ„์˜ ๋ฐฐ๊ฒฝ:

700 ๊ถŒํ•œ์ด ์žˆ๋Š” $ restic-backup.sh /Users/myuser/bin $์— ์žˆ์Šต๋‹ˆ๋‹ค(๋ฃจํŠธ/sudo ์ฝ๊ธฐ/์“ฐ๊ธฐ/์‹คํ–‰๋งŒ). ๋‚ด ๋ฃจํŠธ crontab sudo crontab -e ๋กœ ์ด ํŒŒ์ผ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. iTerm์„ ๊ธฐ๋ณธ ํ„ฐ๋ฏธ๋„๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Homebrew์™€ ํ•จ๊ป˜ restic ๋ฐ zsh ๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ „์ฒด ๋””์Šคํฌ ์•ก์„ธ์Šค:

ํฌ๋ก  ==> /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๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.)

์ €๋Š” homebrew๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋จผ์ € /usr/local/bin/restic ๋ฅผ ์ „์ฒด ๋””์Šคํฌ ์•ก์„ธ์Šค์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ  ๋™์ผํ•œ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ค์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค(๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์ด ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งค๋ฒˆ restic updates): /usr/local/Cellar/restic/0.9.2/bin/restic , ๋ถˆํ–‰ํžˆ๋„ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ ์—†์Œ, ์ „์ฒด ๋””์Šคํฌ ์•ก์„ธ์Šค์— ๋ฐ”์ด๋„ˆ๋ฆฌ ์ถ”๊ฐ€, ํ„ฐ๋ฏธ๋„๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜๊ณ  sudo myscript.sh ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ํŒŒ์ผ์—์„œ ์ž‘๋™ํ–ˆ์ง€๋งŒ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ๋Š” ๊ถŒํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, ๋‚ด sftp pubkey ์ธ์ฆ์ด launchctl(๋ฃจํŠธ)์—์„œ ์‹คํ–‰ํ•  ๋•Œ ์ž‘๋™์ด ์ค‘์ง€๋˜์ง€๋งŒ ๋ฃจํŠธ๋กœ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์ž‘๋™ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ(Mojave ๊ด€๋ จ) ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์„ค์ •๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ๋ฌธ์ œ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์„ธ์š”.

ํฅ๋ฏธ๋กœ์šด. restic์„ ์ง์ ‘ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋ฐ/๋˜๋Š” FDA์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์†”์งํžˆ ์—ฌ๊ธฐ ์–ด๋‘์šด ๊ณณ์—์„œ ์ดฌ์˜ํ•ฉ๋‹ˆ๋‹ค. Mojave๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์‹œ๋„ํ•ด ๋ณด์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

๋‚ด /usr/local/bin/bash ์ž์ฒด๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค sudo bash myscript.sh ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— FDA์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

FDA์— /usr/local/bin/bash ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ฃผ์‚ฌ์œ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: chmod +x ์ดํ›„์—๋„ ๋‚ด backup.sh ๋Š” ์—ฌ์ „ํžˆ FDA์— ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค( bash ๋ฐ restic ๋ฐ”์ด๋„ˆ๋ฆฌ ํ•  ์ˆ˜์žˆ๋‹ค). ์ด์ƒํ•œ.

EDIT2: ์ฒ ์ €ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด bash ๋ฐ restic ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ชจ๋‘ FDA์— ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ restic๋ณด๋‹ค ๋” ํฐ ๋ฌธ์ œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค /bin/ls ๋ฅผ FDA ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

$ 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 ์‹คํ–‰(๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ์•ผ๊ฐ„์— ์‹คํ–‰๋˜๋Š” /Library/LaunchDaemons/com.n8henrie.restic.plist #$5$#$์˜ launchd ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜)์—์„œ ๋‚ด ๋กœ๊ทธ๋ฅผ ํ™•์ธํ–ˆ์„ ๋•Œ ๊ถŒํ•œ ์˜ค๋ฅ˜๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์ด์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. FDA์—์„œ Terminal.app ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ sudo launchctl start com.n8henrie.restic ๋˜๋Š” sudo /usr/local/bin/bash mybackup.sh ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์—ฌ์ „ํžˆ ๊ถŒํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์•„, FDA์— Terminal.app , /usr/local/bin/bash ๋ฐ /usr/local/Cellar/restic/0.9.2/bin/restic 3๊ฐœ๋ฅผ ๋ชจ๋‘ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ์ด์ œ ์˜ค๋ฅ˜ ์—†์ด ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿคทโ€โ™‚๏ธ

FWIW, ์—ฌ๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํŒŒ์ผ ๋ชฉ๋ก์ด ํฌํ•จ๋œ ๋‚ด ๋กœ๊ทธ ์ถœ๋ ฅ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‚ด ์‚ฌ์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@n8henrie ์ด์ „์— ๋งํฌํ•œ Mac ์ง€์› ์Šค๋ ˆ๋“œ์—์„œ FDA๋Š” ์Šน์ธ๋œ ์•ฑ์ด Applications ํด๋”์— ๋“ฑ๋ก๋œ .app ๋ฒˆ๋“ค์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์š”๊ตฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Terminal.app์ด ์„ฑ๊ณตํ•œ ์ด์œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ํ•˜์ง€๋งŒ 3๊ฐœ๋ฅผ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ FDA์—? ํฅ๋ฏธ๋กœ์šด...

@mholt ๋ญ”๊ฐ€ ๋‹ค๋ฅธ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ด์ œ์™€ ๋˜‘๊ฐ™์ด ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ๋‘์—ˆ๊ณ (FDA์—์„œ 3๊ฐœ ๋ชจ๋‘ ํ—ˆ๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ) ๋ฐค์ƒˆ ์‹คํ–‰ํ•ด๋„ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์ด์ „ ํ—ˆ๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ง€๊ธˆ ๋‘ ๋ฒˆ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ๋™์•ˆ ์ˆ˜์ •ํ•œ ํ›„ ๊ถŒํ•œ ์˜ค๋ฅ˜ ์—†์ด ์‹คํ–‰๋˜๊ณ  ๋‹ค์‹œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. restic์€ ํŒŒ์ผ์„ ์—ด์ง€ ์•Š๊ณ ๋„ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์–ด๋–ป๊ฒŒ ๋“  ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ผ์ข…์˜ ์บ์‹œ์ž…๋‹ˆ๊นŒ? ๋ฐ€์ ‘ํ•˜๊ฒŒ ํ•จ๊ป˜ ์ˆ˜ํ–‰๋˜๋Š” ์‹คํ–‰์— ์†๊ณ  ์žˆ๊ณ  ํŒŒ์ผ์— ๋Œ€ํ•œ ์ค‘๊ฐ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์œผ๋ฏ€๋กœ restic์ด ํŒŒ์ผ์„ ์—ด๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์งˆ๋ฌธ. ๋‚˜๋Š” restic์ด ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ถŒํ•œ ์˜ค๋ฅ˜ ๋“ฑ์˜ ๊ฒฝ์šฐ ์บ์‹œ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ ๊ทน์ ์œผ๋กœ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

SO์—์„œ์˜ ๊ด€๋ จ ํ† ๋ก : https://apple.stackexchange.com/q/338213/27415

์ข‹์€ ์งˆ๋ฌธ. ๋‚˜๋Š” restic์ด ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ถŒํ•œ ์˜ค๋ฅ˜ ๋“ฑ์˜ ๊ฒฝ์šฐ ์บ์‹œ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ ๊ทน์ ์œผ๋กœ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ณ„๋ง์”€์„ ์š”. ์บ์‹œ์—๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ํŒŒ์ผ๋งŒ ํฌํ•จ๋˜๋ฉฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์—†๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ข‹์•„์š” -- ์˜ˆ, ์ด๊ฒƒ์ด restic์˜ ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ™•์‹คํžˆ macOS Mojave ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ๋‚˜๋Š” restic ์ž์ฒด๊ฐ€ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ฌผ๊ฑด์„ ์ฐพ์œผ๋ฉด ๋” ๋งŽ์€ ์˜๊ฒฌ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ๊ฐ์‚ฌ ํ•ด์š”!

๋ฌธ์ œ๊ฐ€ ์ด๋ฏธ ์ข…๋ฃŒ๋œ ๊ฒƒ์„ ๋ณด๊ณ  ์กฐ๊ธˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค.
์ฃผ์š” ํ”Œ๋žซํผ๊ณผ์˜ ์ฃผ์š” ๋น„ํ˜ธํ™˜์„ฑ ๋ฐ ์ด ์‹œ์ ์—์„œ ์ข…๋ฃŒ
"๋ˆˆ์— ๋„์ง€ ์•Š๊ฒŒ, ๋งˆ์Œ์—์„œ ๋ฉ€์–ด์ง€๊ฒŒ" ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ฃผ๋กœ ์ œํ•œ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.
MacOS ์‚ฌ์šฉ์ž๊ฐ€ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•ฉ๋ฆฌ์ ์ธ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Œ€๋กœ,
๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ๋ฐฑ์—…ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ ๋Šฅ๋ ฅ
๋ฐ์ดํ„ฐ(์˜ˆ: ์‚ฌ์ง„)๋Š” ์˜ ํ˜„์žฌ ๋ฒ„์ „์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์†์ƒ๋ฉ๋‹ˆ๋‹ค.
๋งฅ OS. ๋ฐฑ์—… ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฒฝ์šฐ ์ €์—๊ฒŒ๋Š” ํฐ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ/๊ฐ€๋Šฅ์„ฑ(์ž‘์—…์„ ๋•๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค):

  • ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ์„ฑ

    • ์ ์ ˆํ•œ MacOS ๋ž˜ํผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

      ๋‚˜๋จธ์ง€ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ FDA ๋ชฉ๋ก์— ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์œ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ œ๊ณตํ•˜๋Š” ๋Œ€์‹ 

      ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

      ์–ด๋–ค ์ข…๋ฅ˜์˜ Makefile ๋˜๋Š” XCode์™€ ํ•จ๊ป˜?

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • ๊ฐ€์žฅ ์•ˆ์ „ํ•œ/์ตœ์†Œ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๋ฌธ์„œ์— ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

      FDA์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”

    • SIP ๋น„ํ™œ์„ฑํ™”์— ๊ด€ํ•œ ์ •๋ณด(๋ฐ ์œ„ํ—˜)์— ๋Œ€ํ•œ ๋งํฌ ์ œ๊ณต

  • ๊ฒฝ๊ณ 

    • Mojave ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์—†๋Š” ๋ฌธ์„œ์˜ ์ •๋ณด ํฌํ•จ

      ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๋ฐฑ์—…๋จ

์ „๋ฐ˜์ ์œผ๋กœ ์ƒํ™ฉ์€ ๋ฃจํŠธ๊ฐ€ ์—†๋Š” ์ „์ฒด ๋ฐฑ์—… ๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
Linux์—์„œ SIP๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋ฃจํŠธ ๋ฐ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์•ˆ์ „ํ•œ ํƒ€ํ˜‘์„ ๊ฒฐ์ •ํ•˜๊ณ  ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
FDA๋Š” setcap ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๋‚ด MacBook์ด ์ด๋ฒˆ ์ฃผ์— ๋งค์žฅ์— ์žˆ์œผ๋ฏ€๋กœ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ด ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•ด ์ฆ‰์‹œ ์ž‘์—…ํ•˜์ง€๋งŒ ์ƒ๊ฐ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ; ์•„๋งˆ๋„ ๋‚˜๋Š” ๊ธฐ์ดˆ์—์„œ ๋ฒ—์–ด๋‚˜ ์žˆ๊ฑฐ๋‚˜ ์•„๋งˆ๋„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ฌด์ง€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ฌธ์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋‚˜๋จธ์ง€ ํŒ€ ์›Œํฌํ”Œ๋กœ.

๋‚ด ์ปดํ“จํ„ฐ๋ฅผ ๋˜์ฐพ์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด launchd ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ „์ฒด ์‹œ์Šคํ…œ ๋ฐฑ์—…์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์œ„์˜ ์„ฑ๊ณต์„ ๋ณต์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

๋‹ค์Œ์œผ๋กœ ๋‚˜๋Š” FDA์— ์ถ”๊ฐ€๋œ ๊ฒฝ์šฐ์—๋„ ํ—ˆ๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด Restic์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค, ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ธ ๋‹ค์Œ ์„ค๋ช…์„œ์— ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

~FDA ๋ชฉ๋ก์— restic ๊ฐ€ ์ถ”๊ฐ€๋œ ์ƒํƒœ์—์„œ ์ƒˆ๋กœ์šด repo์—์„œ Open ์˜ค๋ฅ˜๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.~

์•„๋ž˜ ํŽธ์ง‘์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

$ 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์™€ ์ผ๊ด€๋˜๊ฒŒ ์ž‘๋™ํ–ˆ์ง€๋งŒ 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 ๋ณดํ˜ธ ํŒŒ์ผ์ด ๋ฐฑ์—…๋˜๋Š” ๋™์•ˆ ๋ฃจํŠธ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ(์˜ˆ: ๋ฃจํŠธ -์†Œ์œ  0600 ๋ฌผ๊ฑด).

์ด ์‹œ์ ์—์„œ ๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ AppleScript๊ฐ€ sudo ๋กœ ๋ฐฑ์—… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์•”ํ˜ธ ์—†์ด ๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( 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์— ๋Œ€ํ•œ ์†Œ๊ทœ๋ชจ ํ™๋ณด ์ž‘์—…์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. net (ํ•ฉ๋ฆฌ์ ์ธ ๊ฒฝ์šฐ).

์•ˆ๋…•ํ•˜์„ธ์š” @n8henrie , ์ด ์ •ํ™•ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐพ์€ ํ›„ ์—ฌ๊ธฐ์— ์™”์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์—ฐ๊ตฌ๋ฅผ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์†”๋ฃจ์…˜(๊ฐ„๋‹จํ•œ Go ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์…ธ ์Šคํฌ๋ฆฝํŠธ ํ˜ธ์ถœ)์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒ์ผ์— ์„ฑ๊ณต์ ์œผ๋กœ ์•ก์„ธ์Šคํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ํŠนํžˆ stdout/stderr์ด /dev/null์— ํ๊ธฐ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด restic์ด ์•”ํ˜ธ๋ฅผ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ stdin์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (๋˜ํ•œ ์•ฝ๊ฐ„ ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ bash๊ฐ€ /usr/local/bin/bash ์ด๊ณ  /bin/bash ๊ฐ€ ์•„๋‹Œ๊ฐ€์š”? ๊ทธ๋ƒฅ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.)

์–ด์จŒ๋“  ์˜ค๋ฅ˜ ์ถœ๋ ฅ์„ ๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๊ท€ํ•˜์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ๋ณด๊ธฐ ์ „์— ์ €์˜ ์ฒซ ๋ฒˆ์งธ ๋ณธ๋Šฅ์€ RESTic ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์ฒด๋ฅผ 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

๋™์ผํ•œ ์ˆ˜์ •์ด ์ œ ์•„๋‚ด์˜ Macbook Air์—์„œ๋„ ์ž‘๋™ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‘˜ ๋‹ค restic find '/Users/*/Library/Mail' --snapshot latest --host=$(hostname) ๋กœ ์›๊ฒฉ์—์„œ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ~/Library/Mail ๋Š” ์œ„์˜ ์˜ค๋ฅ˜ ๋กœ๊ทธ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค) .

๋‚˜๋Š” ํŠนํžˆ stdout/stderr์ด /dev/null์— ํ๊ธฐ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด restic์ด ์•”ํ˜ธ๋ฅผ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ stdin์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ „์ ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‚ด ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚ด ์„ค์ •์€ ์™„์ „ํžˆ ์ž๋™ํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— (๋ฃจํŠธ ์†Œ์œ  0600) ํŒŒ์ผ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฝ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์ง€๋งŒ envvar ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์—์„œ ์ฝ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹  ๋ง์ด ๋งž์•„, ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋Œ€ํ™”ํ˜• ๋ฌผ๊ฑด์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๊ฒƒ์„ &>> /path/to/file.log ํŒŒ์ผ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

(๋˜ํ•œ ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค. bash๊ฐ€ /usr/local/bin/bash์ด๊ณ  /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 ์— ๋น„ํ•ด ๋ช‡ ๋ฒˆ์˜ ํ‚ค ์ž…๋ ฅ์„ ์ ˆ์•ฝํ•จ)์™€ ๊ฐ™์€ ๋ณด๋‹ค ํ˜„๋Œ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ๋ณด๊ธฐ ์ „์— ์ €์˜ ์ฒซ ๋ฒˆ์งธ ๋ณธ๋Šฅ์€ RESTic ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์ฒด๋ฅผ FDA์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์œผ๋ฉฐ 10.14.1(18B75)์—์„œ๋Š” ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ(์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Go ๋ž˜ํผ, ๊ถ๊ทน์ ์œผ๋กœ restic์„ ํ˜ธ์ถœํ•˜๋Š”)์„ ์‚ฝ์ž…ํ•˜๋ฉด ๋ณ€๊ฒฝ๋˜๋Š” ์ด์œ ๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ bash ์Šคํฌ๋ฆฝํŠธ(๋Œ€์ƒ, ๋ฐฑ์—… ๊ฒฝ๋กœ ๋ฐ ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋‹ค์†Œ ๋ณต์žกํ•œ sftp ๋ช…๋ น)์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ์„ค์ •์ด ๋งŽ์ด ์žˆ์œผ๋ฏ€๋กœ ๋‚˜๋จธ์ง€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์˜ต์…˜. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•ฝ๊ฐ„ ์‹คํ—˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์žฌ๊ตฌ์ถ•, ์žฌ๋ถ€ํŒ… + FDA ์ถ”๊ฐ€๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ operation not permitted ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์ง„ ๋ž˜ํผ์™€ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ชจ๋‘ /Applications๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์šด์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์† ํŒŒํ—ค์น˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ญ. ๋‚˜๋ฅผ ์œ„ํ•ด /Applications์— ์žˆ์„ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ 10.14 ๋˜๋Š” 10.14.1์— ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋Š” ํ›„์ž์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์ฐธ์กฐํ•œ tccutil ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋ฏธ๋ฆฌ ์ง€์›Œ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” 10.14.1(18B75)์— ์žˆ์Šต๋‹ˆ๋‹ค. tccutil ๋ช…๋ น๋„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์šด์ด ์—†์Šต๋‹ˆ๋‹ค. ์• ํ”Œ์ด ์™œ ์ด๋Ÿฌ๋Š”์ง€ ์•Œ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๊ฒฝ๋กœ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ์ •๋ง ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค.

๋ญ. ์ด์ƒํ•˜๋‹ค.

์ด์ƒํ•˜๊ฒŒ๋„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‚˜๋จธ์ง€ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ (์ €๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋˜ ๋‹ค๋ฅธ ๊ฐ„ํ—์  ์˜ค๋ฅ˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค -- ๋ณด๋ฅ˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ฌธ์„œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ณต์‹ ๋ฌธ์„œ/์ž‘์„ฑ
๋™์ผํ•œ ์‹œ์Šคํ…œ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์ปดํ“จํ„ฐ. ๋‚˜๋Š” 2 for 2์ธ๋ฐ ์™œ ๊ทธ๋Ÿฐ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด
@armhold์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@armhold , ์ •ํ™•ํ•œ bash ์Šคํฌ๋ฆฝํŠธ์™€ Go ์ฝ”๋“œ์˜ ์‚ฌ๋ณธ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์‚ฌ์šฉํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋์—์„œ ์žฌ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด์ƒํ•˜๊ฒŒ๋„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‚˜๋จธ์ง€ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋„ค, ๊ทธ๊ฒŒ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์ฒด๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ณณ์—์„œ Go ๋ž˜ํผ๊ฐ€ ์„ฑ๊ณตํ•˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ๋–จ์–ด์ ธ ๋ณด์ธ๋‹ค.

์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ •ํ™•ํ•œ bash ์Šคํฌ๋ฆฝํŠธ์™€ Go ์ฝ”๋“œ์˜ ์‚ฌ๋ณธ์„ ๊ฒŒ์‹œํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก  ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/armhold/restic-fda.

  • ์‰˜ ์Šคํฌ๋ฆฝํŠธ์™€ go wrapper๋Š” ๋ชจ๋‘ ๋‚ด ~/bin ๋””๋ ‰ํ† ๋ฆฌ์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ ๊ธฐ๋ณธ ์„ค์ •์„ ํ†ตํ•ด FDA์— ~/bin/restic-fda ์ถ”๊ฐ€
  • ํ„ฐ๋ฏธ๋„์˜ ๋ช…๋ น์ค„์—์„œ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž ๊ณ„์ •์—์„œ ๋Œ€ํ™”ํ˜•์œผ๋กœ restic-fda ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. error: Open: open /Users/armhold/Library/Application Support/AddressBook: operation not permitted ์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฃจํŠธ๋กœ ์‹คํ–‰(sudo๋ฅผ ํ†ตํ•ด)๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” launchctl์„ ํ†ตํ•ด ์‹คํ–‰์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฐฉํ™”๋ฒฝ์ธ Little Snitch๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๊ฐ€๋Š” ์—ฐ๊ฒฐ์˜ ๊ฒฝ์šฐ "๋‹จ๋ง์„ ํ†ตํ•œ ํ„ฐ๋ฏธ๋„"์ด ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค๋„๋ก ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฌป์Šต๋‹ˆ๋‹ค(๋‹จ์ˆœํ•œ ์ œํ•œ์ด ์•„๋‹Œ). ์ฆ‰ Terminal.app์ด ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋‚ด๊ฐ€ ํ•œ ๊ฒƒ์€ Platypus ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์•ฑ์œผ๋กœ ๋ฌถ๊ณ  ์ƒ์„ฑ๋œ ์•ฑ์— FDA๋ฅผ ์Šน์ธํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Finder๋ฅผ ํ†ตํ•ด ๋ฐฑ์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

launchctl์€ ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค(์ตœ์‹  MacOS ์ดํ›„ ํฌํ•จ
์—…๋ฐ์ดํŠธ). @armhold์—์„œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ์ „ํžˆ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํฌ๊ธฐํ•˜๊ณ  ํ„ฐ๋ฏธ๋„ FDA๋ฅผ ์ฃผ์—ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„, ๋‚˜๋Š” ๋‹ค์‹œ ๋‹นํ™ฉํ–ˆ๋‹ค.

์ €๋Š” 10.14.2์ž…๋‹ˆ๋‹ค. ๋‚ด restic ๋ฐฑ์—… ์Šคํฌ๋ฆฝํŠธ๋Š” ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๊ณ  ๋กœ๊ทธ์— ๊ถŒํ•œ ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ @armhold ์˜ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ์ด์ „ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ณดํ˜ธ๋œ ๋””๋ ‰ํ† ๋ฆฌ ~/Library/Mail ๋ฅผ ์—ฌ๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Œ).

๐Ÿคทโ€โ™‚๏ธ

์ƒˆ๋กœ์šด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ (์ž‘๋™ํ•˜๋Š”) ๋ž˜ํผ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋ง์€, ์˜ค๋ž˜๋œ ํŒŒ์ผ์„ ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š๊ณ  ๋”ฐ๋ผ์„œ ์ด๋ฏธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์žˆ๋Š” ๊ฒƒ์ด ํ™•์‹คํ•ฉ๋‹ˆ๊นŒ? restic์ด ํŠธ๋ฆฌ๋ฅผ ๊ฑท๋Š” ๋™์•ˆ ๋ณดํ˜ธ๋œ ํด๋”๋กœ ๋‚ด๋ ค๊ฐ€๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋™์•ˆ ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@mholt ์ด ์œ ๋ฌผ๊ณผ ์œ ๋ฌผ์˜ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ๋“  ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ทจํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ช‡ ๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ ์ด ๋™์ž‘๋„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์„ฑ๊ฐ€์‹œ๊ณ  ๋ฌผ๊ฑด์„ ํฌ์žฅํ•˜๊ณ  ์–ด์ง€๋Ÿฝํžˆ์ง€ ์•Š๊ณ ๋Š” ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@rawtaz

์ด ์œ ๋ฌผ๊ณผ ์œ ๋ฌผ์˜ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์กฐ์น˜๋ฅผ ์ทจํ–ˆ๋Š”์ง€ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ง€๋‚œ์ฃผ์— ์ง์ ‘ Mojave๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Relica๋ฅผ ์„ค์น˜ํ•˜๊ณ  ~/Library/Mail์„ ๋ฐฑ์—…ํ•˜๋ ค๊ณ  ํ•  ๋•Œ "์ž‘์—…์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ" ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ FDA ํ™”๋ฉด์— Relica.app ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  Relica ๋ฐฑ์—…์„ ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋ฒˆ์—๋Š” ์˜ค๋ฅ˜ ์—†์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฑ์—…๋˜์—ˆ์Šต๋‹ˆ๋‹ค(Relica+restic์—์„œ ๋งŒ๋“  ์ฒซ ๋ฒˆ์งธ ์Šค๋ƒ…์ƒท์€ ๊ถŒํ•œ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฉ”์ผ ํด๋”๋ฅผ ์ „ํ˜€ ํ‘œ์‹œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค).

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

๊ทธ๋ž˜์„œ ์ €๋Š” ์ด ์Šค๋ ˆ๋“œ์— ๊ธฐ์—ฌํ•  ๋‹ต๋ณ€์ด ์—†์Šต๋‹ˆ๋‹ค. :-/ ๊ทธ๊ฒƒ์ด _๊ณ„์†_ ์ž‘๋™ํ• ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋ฌผ๋ก  ๊ทธ๋ ‡๊ฒŒ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋„ ๋‚ด restic ๋ฐฑ์—… ์Šคํฌ๋ฆฝํŠธ๋ฅผ FDA์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก .app ๋ฒˆ๋“ค๋กœ ๋ž˜ํ•‘ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์งœ์ฆ๋‚˜์ง€๋งŒ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์‹ค์šฉ์ ์ธ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” restic ์ด์ง„ FDA๋งŒ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ๋ฐฑ์—… ์Šคํฌ๋ฆฝํŠธ(restic์„ ํ˜ธ์ถœํ•˜๋Š” Bash ์Šคํฌ๋ฆฝํŠธ) FDA๋ฅผ ์ œ๊ณตํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
@armhold ์˜ ๋ž˜ํผ๋ฅผ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ ์˜ค๋ฆฌ๋„ˆ๊ตฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. .app ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ macOS์˜ ์‹œ์Šคํ…œ ์„ค์ •์—์„œ FDA์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ์œ ์ผํ•œ ๋‹จ์ ์€ .app์ด ์‹œ์ž‘๋  ๋•Œ(์ €๋ฅผ ์œ„ํ•ด open -ga ~/Applications/Backup.app ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ crontab์— ์˜ํ•ด ์‹œ์ž‘๋˜๊ณ  ํ˜„์žฌ ์ฐฝ์ด ํฌ์ปค์Šค๋ฅผ ์žƒ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ฌ๊ฐํ•œ ์„ฑ๊ฐ€์‹ค ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒŒ ๋ญ์ง€. ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ๋‹ค์‹œ ์ž‘๋™ํ•˜๋Š” ๋ฐฑ์—…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋‚˜๋Š” -g ์Šค์œ„์น˜๊ฐ€ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค.

.app ๋ฒˆ๋“ค์„ ์‚ญ์ œํ•˜๊ณ (ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™, ํœด์ง€ํ†ต ๋น„์šฐ๊ธฐ) ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ƒˆ .app ๋ฒˆ๋“ค๋กœ ๊ต์ฒดํ•  ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋งค์šฐ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ด€์ฐฐ์— ๋”ฐ๋ฅด๋ฉด ์ด์ „ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๋ฉด ์‹œ์Šคํ…œ ๊ธฐ๋ณธ ์„ค์ •์˜ FDA ํ•ญ๋ชฉ์ด ์‚ฌ๋ผ์ง€์ง€๋งŒ ์ƒˆ ํ•ญ๋ชฉ์„ ๊ฐ™์€ ์œ„์น˜์— ๋‹ค์‹œ ๋„ฃ์œผ๋ฉด ํ•ญ๋ชฉ์ด ๋‹ค์‹œ ๋‚˜ํƒ€๋‚˜ ์‹œ์Šคํ…œ์ด ์ƒˆ .app์„ ์ธ์‹ํ•˜๊ณ  ๊ณ ๋ คํ•  ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. FDA๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ํ›„ ์ƒˆ ์•ฑ์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์›๋ž˜ ์˜ค๋ฅ˜๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์„ค์ •์—์„œ ์•ฑ์— ๋Œ€ํ•œ FDA ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ FDA ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‹ค์‹œ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€๊ธˆ์€ .app ๋ฒˆ๋“ค์„ ๊ต์ฒดํ•  ๋•Œ ์ž‘๋™ํ•˜๋„๋ก FDA ํ•ญ๋ชฉ๋„ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. .app ๋ฒˆ๋“ค์˜ ์ผ๋ถ€๋งŒ ๊ต์ฒดํ•ด๋„ ๊ณ„์† ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. AFAICT์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

restic์„ .app ๋ฒˆ๋“ค๋กœ ๋ฌถ๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์„ ์œ„ํ•ด ๋ช‡ ๋‹ฌ ์ „์— Go ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์›ํ•˜๋Š” ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž‘์„ฑํ•œ ๋‹ค์†Œ ์ผ๋ฐ˜์ ์ธ ์ž์Šต์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•: 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 ์™€ ๋˜‘๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ์ด์ œ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ์ ์šฉ๋˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๋‚ด ์„ค์ •์˜ ์•ฝ๊ฐ„์˜ ๋ฐฐ๊ฒฝ:

700 ๊ถŒํ•œ์ด ์žˆ๋Š” $ restic-backup.sh /Users/myuser/bin $์— ์žˆ์Šต๋‹ˆ๋‹ค(๋ฃจํŠธ/sudo ์ฝ๊ธฐ/์“ฐ๊ธฐ/์‹คํ–‰๋งŒ). ๋‚ด ๋ฃจํŠธ crontab sudo crontab -e ๋กœ ์ด ํŒŒ์ผ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. iTerm์„ ๊ธฐ๋ณธ ํ„ฐ๋ฏธ๋„๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Homebrew์™€ ํ•จ๊ป˜ restic ๋ฐ zsh ๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ „์ฒด ๋””์Šคํฌ ์•ก์„ธ์Šค:

ํฌ๋ก  ==> /usr/sbin/cron
iTerm.app ==> /Applications/iTerm.app

@n8henrie ์ฒ˜๋Ÿผ ์‹ค์ œ๋กœ restic ์™€ ๊ฐ™์€ ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ FDA๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ๊ทธ๋žจ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋Œ€์‹  ์ดˆ๊ธฐ sudo ์š”์ฒญ์„ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์—๋Š” FDA๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. cron ์ž๋™ ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ iTerm.app ์ž…๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์„ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๋ฉด ์•ฑ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ฑ์„ ์ง์ ‘ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์•ฑ ์ž์ฒด๋Š” ์ „ํ˜€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž„์˜์˜ ์•ฑ์— ๋ณต์‚ฌํ•˜๊ณ  ํ•ด๋‹น ์•ฑ์„ ํ—ˆ์šฉ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ฃผ์˜ ์‚ฌํ•ญ์€ ์•ฑ ๋‚ด์—์„œ ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ํ—ˆ์šฉ ๋ชฉ๋ก์— ์•ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@atticusmatticus @russelldavis -- ์ตœ๊ทผ์˜ MacOS ์—…๋ฐ์ดํŠธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋‹ค์‹œ ๋ณ€๊ฒฝํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค -- ์ €๋Š” ํ™•์‹คํžˆ ๋‘ ๊ฐ€์ง€ ์ „๋žต์„ ๋ชจ๋‘ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์šด์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋˜ํ•œ ์ž‘๋™์„ ๋ฉˆ์ท„์ง€๋งŒ ์ง€๊ธˆ์€ ๋‹ค์‹œ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ผ์ข…์˜):

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/ not /Library/ ๋ฐ launchctl load not 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
launchd ์‹คํ–‰ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ด๋™|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 ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, launchd ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://eclecticlight.co/2018/10/02/how-privacy-protection-is-enforced-through-the-attribution-chain/

https://eclecticlight.co/2018/09/06/working-with-mojaves-privacy-protection/

๋ฌธ์„œ์—์„œ ์ตœ์†Œํ•œ ๋ช‡ ๊ฐ€์ง€ ์ง€์นจ(๋ฐ ์•„๋งˆ๋„ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋งํฌ)์„ ์ œ๊ณตํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๊ดœ์ฐฎ์œผ๋ฉด ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Linux์—์„œ ๋ฃจํŠธ๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋ฐฑ์—… ํ•˜๋Š” ์„น์…˜๊ณผ ๊ฐ™์ด ์˜ˆ์ œ ์•„๋ž˜์˜ ์ƒˆ๋กœ์šด ์š”์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‹ค์Œ ์‚ฌํ•ญ์— ์œ ์˜ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

  • ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๋””์Šคํฌ๋ฅผ ๋ฐฑ์—…ํ•˜๋ ค๋ฉด ์ „์ฒด ๋””์Šคํฌ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฃจํŠธ๋กœ ์‹คํ–‰๋˜๋Š” launchd ์Šคํฌ๋ฆฝํŠธ๋Š” launchd๋ฅผ FDA์— ์ถ”๊ฐ€ํ•  ํ•„์š” ์—†์ด FDA์— ๋”ฐ๋ผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Terminal.app์ด FDA์— ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ํ˜ธ์ถœํ•  ๋•Œ ์ „์ฒด ๋””์Šคํฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Terminal.app์ด FDA์— ๋“ฑ๋ก๋˜์–ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ FDA์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ „์ฒด ๋””์Šคํฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์ดํ•ด์™€ ๊ฒฝํ—˜์„ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๊นŒ?

๋‹ค์†Œ ๋ณต์žกํ•˜์ง€๋งŒ ์ง€๋‚œ 1๋…„ ๋™์•ˆ 2๋Œ€์˜ Macbook์—์„œ ์‹คํ–‰๋˜๋Š” ์„ค์ •์— ๋งŒ์กฑํ–ˆ์œผ๋ฉฐ ์•„๋งˆ๋„ ๊ทธ ์ผ๋ถ€๋ฅผ ์˜ˆ๋กœ ํฌํ•จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์Šคํ…œ๋ณ„ restic ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” 4๋Œ€์˜ Linux ์ปดํ“จํ„ฐ์—์„œ๋„ ๋™์ผํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋จ).
  • ๋‚ด MacOS ์ปดํ“จํ„ฐ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ„์˜ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” go ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์‰ฌ์šด ๊ตฌ์„ฑ/์—…๋ฐ์ดํŠธ/๋ฒ„์ „ ์ œ์–ด๋ฅผ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ Go์—์„œ ์ง์ ‘ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” FDA์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ์ •์— ๋”ฐ๋ผ ์ด go ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ ์ „์ฒด์—์„œ ์‹คํ–‰๋˜๋Š” launchd ๋ฐ๋ชฌ(๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰)์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/restic/restic/issues/2051#issuecomment -442872479์™€ ์œ ์‚ฌํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— c๋กœ ๊ฐ”๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ:

  1. ๋ฐฑ์—….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 ์—†์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ด๋™ err err
sudo ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ด๋™ err err
launchd ์‹คํ–‰ ์‹คํ–‰ ๋ฐ”์ด๋„ˆ๋ฆฌ RUNS ์˜ค๋ฅ˜

๊ฐ์‚ฌ ํ•ด์š”!

๋‚˜๋ฅผ ์œ„ํ•œ ์†”๋ฃจ์…˜์€ -p, --exclude-files, --files-from ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ restic์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ  ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋‚ด๋ถ€ ๋˜๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ์— ๋„ฃ๋Š” .plist ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๋ฐ”์ด๋„ˆ๋ฆฌ 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์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ
  • launchd.plist๋ฅผ ํ†ตํ•ด ์‹คํ–‰, Program ๋˜๋Š” ProgramArguments ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ
  • ํ„ฐ๋ฏธ๋„, Terminal.app์—์„œ ์‹คํ–‰
  • ssh, /usr/libexec/sshd-keygen-wrapper ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ํ†ตํ•ด ์‹คํ–‰
  • ๋‹ค๋ฅธ ์•ฑ์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜์—ฌ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

๋”ฐ๋ผ์„œ @n8henrie ์˜ ๊ฒฝ์šฐ ์‹ค์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

launchd๋ฅผ ํ†ตํ•ด ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•: ์ด์ œ LaunchControl ์—๋Š” ํ—ˆ์šฉ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” fdautil ๋ผ๋Š” ๋„์šฐ๋ฏธ๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๊ณ  fdautil exec ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LaunchControl ๋˜๋Š” fdautil set ๋ฅผ ํ†ตํ•ด ํ—ˆ์šฉํ•œ ๋ช…๋ น๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

https://www.soma-zone.com/LaunchControl/FAQ.html ์— ์ด์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉฐ ์•ฑ์˜ ๋„์›€๋ง ์ฐฝ์— ์ž์„ธํ•œ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰