From 0fcf36b716e6cd3ee4ea5fed49e62f44deba006b Mon Sep 17 00:00:00 2001 From: Awin Huang Date: Thu, 11 Jan 2024 23:26:54 +0800 Subject: [PATCH] vault backup: 2024-01-11 23:26:54 --- .obsidian/workspace.json | 8 ++++---- 00. Inbox/樹莓派.canvas | 4 +++- attachments/Pasted image 20240111231507.png | Bin 0 -> 7971 bytes 3 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 attachments/Pasted image 20240111231507.png diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index e160b72..dda0417 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -43,9 +43,9 @@ "state": { "file": "00. Inbox/樹莓派.canvas", "viewState": { - "x": 185.30005424431187, - "y": 718.2152005479293, - "zoom": -0.5833333333333334 + "x": 158.63308538124915, + "y": 489.54031568874063, + "zoom": 0.41505991123918184 } } } @@ -217,6 +217,7 @@ }, "active": "069e76e47c814366", "lastOpenFiles": [ + "attachments/Pasted image 20240111231507.png", "00. Inbox/SSIM.md", "00. Inbox/樹莓派.canvas", "05. 資料收集/Tool Setup/Software/vim.md", @@ -249,7 +250,6 @@ "02. 個人:Daily/2023/2023年度目標.md", "02. 個人:Daily/2024", "02. 個人:Daily/2023/12/2023-12-01(週五).md", - "05. 資料收集/04. Programming/FFMPEG/ffmpeg command.md", "02. 個人:Daily/2023/12", "attachments/Pasted image 20231225164717.png", "attachments/Pasted image 20231225164413.png", diff --git a/00. Inbox/樹莓派.canvas b/00. Inbox/樹莓派.canvas index 54f3470..29b54d9 100644 --- a/00. Inbox/樹莓派.canvas +++ b/00. Inbox/樹莓派.canvas @@ -4,7 +4,9 @@ {"id":"e5bba63eeea5211f","type":"text","text":"# 安裝\n1. 到[官網](https://www.raspberrypi.com/software/)下載`imager`\n2. 記得在`imager`裡面設定ssh public key","x":-440,"y":-47,"width":340,"height":140}, {"id":"3a39140e3c8408cf","type":"text","text":"## 設定 static IP\n1. `sudo vim /etc/dhcpcd.conf`\n2. 填入\n```\ninterface wlan0\nstatic ip_address=192.168.1.21/24\nstatic routers=192.168.1.1\nstatic domain_name_servers=168.95.192.1\n```\n3. reboot","x":-60,"y":200,"width":371,"height":280}, {"id":"48eb138daa4f0fbe","x":-60,"y":500,"width":371,"height":100,"type":"text","text":"## 安裝必須的工具\n1. `sudo apt install dnsutils`"}, - {"id":"6ad2c15172b3b925","x":-60,"y":620,"width":931,"height":423,"type":"text","text":"## 設定 DDNS of Cloudflare\n`~/script/ddns.sh`\n```bash\n#!/bin/bash\nCF_ACCESS_TOKEN=\nCF_ZONE_ID=\nURLS=('awin.one'\n 'blog.awin.one'\n 'ftp.awin.one'\n 'git.awin.one',\n 'storj.awin.one')\nCF_RECORD_IDS=('RECORD_ID_FOR_awin.one'\n 'RECORD_ID_FOR_blog.awin.one'\n 'RECORD_ID_FOR_ftp.awin.one'\n 'RECORD_ID_FOR_git.awin.one'\n 'RECORD_ID_FOR_storj.awin.one')\n\nINTERNET_IP=`curl -s http://ipv4.icanhazip.com`\nINTERFACE_IP=`ip address show ppp0 | grep ppp0 | grep global | awk '{print$2}'`\nDNS_RECORD_IP=`dig +short \"${URLS[0]}\" | grep -Eo '([0-9]{1,3}\\.){3}[0-9]{1,3}' | awk 'NR==1{print}'`\n\nif [ \"$INTERNET_IP\" != \"$DNS_RECORD_IP\" ]\nthen\n echo \"Renew IP: ${DNS_RECORD_IP} to ${INTERNET_IP}\"\n for ((i = 0; i < ${#URLS[@]}; i++)); do\n curl -X PUT \"https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_RECORD_IDS[$i]}\" \\\n -H \"Authorization: Bearer ${CF_ACCESS_TOKEN}\" \\\n -H \"Content-Type: application/json\" \\\n --data '{\"type\":\"A\",\"name\":\"'${URLS[$i]}'\",\"content\":\"'${INTERNET_IP}'\",\"ttl\":120,\"proxied\":false}'\n done\nelse\n echo \"No change: ${INTERNET_IP}\"\nfi\n```\n\n### 參考\n- [5 分鐘整合 Cloudflare API 實做 Cloudflare DDNS 動態 IP 對應網址](https://blog.toright.com/posts/7333/cloudflare-ddns)\n- [自架 DDNS 教學:用 Cloudflare API 達成多域名同步更新! | by Rex | Medium](https://blog.rexyuan.com/%E7%94%A8-cloudflare-dns-api-%E4%BE%86%E9%81%94%E6%88%90-ddns-adaee3c5a84d)"} + {"id":"6ad2c15172b3b925","x":-60,"y":620,"width":931,"height":423,"type":"text","text":"## 設定 DDNS of Cloudflare\n`~/script/ddns.sh`\n```bash\n#!/bin/bash\nCF_ACCESS_TOKEN=\nCF_ZONE_ID=\nURLS=('awin.one'\n 'blog.awin.one'\n 'ftp.awin.one'\n 'git.awin.one',\n 'storj.awin.one')\nCF_RECORD_IDS=('RECORD_ID_FOR_awin.one'\n 'RECORD_ID_FOR_blog.awin.one'\n 'RECORD_ID_FOR_ftp.awin.one'\n 'RECORD_ID_FOR_git.awin.one'\n 'RECORD_ID_FOR_storj.awin.one')\n\nINTERNET_IP=`curl -s http://ipv4.icanhazip.com`\nINTERFACE_IP=`ip address show ppp0 | grep ppp0 | grep global | awk '{print$2}'`\nDNS_RECORD_IP=`dig +short \"${URLS[0]}\" | grep -Eo '([0-9]{1,3}\\.){3}[0-9]{1,3}' | awk 'NR==1{print}'`\n\nif [ \"$INTERNET_IP\" != \"$DNS_RECORD_IP\" ]\nthen\n echo \"Renew IP: ${DNS_RECORD_IP} to ${INTERNET_IP}\"\n for ((i = 0; i < ${#URLS[@]}; i++)); do\n curl -X PUT \"https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_RECORD_IDS[$i]}\" \\\n -H \"Authorization: Bearer ${CF_ACCESS_TOKEN}\" \\\n -H \"Content-Type: application/json\" \\\n --data '{\"type\":\"A\",\"name\":\"'${URLS[$i]}'\",\"content\":\"'${INTERNET_IP}'\",\"ttl\":120,\"proxied\":false}'\n done\nelse\n echo \"No change: ${INTERNET_IP}\"\nfi\n```\n\n### 參考\n- [5 分鐘整合 Cloudflare API 實做 Cloudflare DDNS 動態 IP 對應網址](https://blog.toright.com/posts/7333/cloudflare-ddns)\n- [自架 DDNS 教學:用 Cloudflare API 達成多域名同步更新! | by Rex | Medium](https://blog.rexyuan.com/%E7%94%A8-cloudflare-dns-api-%E4%BE%86%E9%81%94%E6%88%90-ddns-adaee3c5a84d)"}, + {"id":"89db003eaa4162c9","x":-731,"y":1140,"width":886,"height":750,"type":"text","text":"## `/home/awin/script/ddns.sh`\n```bash\n#!/bin/bash\nCF_ACCESS_TOKEN=033xQP4_ZpTq3sSkeftz5J6BWw_R9eoDNTba7zfH\nCF_ZONE_ID=1d6a623d1780c31544fc86f718dac16e\nURLS=('awin.one'\n 'blog.awin.one'\n 'ftp.awin.one'\n 'git.awin.one',\n 'storj.awin.one')\nCF_RECORD_IDS=('d67b2a1b3d7cd520b8e8dad2cb522460'\n '69dcc0bd619b1a3d4a71458faff2aa50'\n 'bd397d9779d42c0b92c9c9c47b765769'\n '4eccb48e85f2daa8fefeb92c8cb4b4ee'\n '216d631bc860c6a11b62e3a1003f3e3e')\n\nINTERNET_IP=`curl -s http://ipv4.icanhazip.com`\nINTERFACE_IP=`ip address show ppp0 | grep ppp0 | grep global | awk '{print$2}'`\nDNS_RECORD_IP=`dig +short \"${URLS[0]}\" | grep -Eo '([0-9]{1,3}\\.){3}[0-9]{1,3}' | awk 'NR==1{print}'`\nNOW_TIME=`date`\n\nif [ \"$INTERNET_IP\" != \"$DNS_RECORD_IP\" ]\nthen\n echo \"Renew IP: ${DNS_RECORD_IP} to ${INTERNET_IP}\"\n echo \"${NOW_TIME}: Renew IP: ${DNS_RECORD_IP} to ${INTERNET_IP}\" > /home/awin/log/ddns.log\n for ((i = 0; i < ${#URLS[@]}; i++)); do\n curl -X PUT \"https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_RECORD_IDS[$i]}\" \\\n -H \"Authorization: Bearer ${CF_ACCESS_TOKEN}\" \\\n -H \"Content-Type: application/json\" \\\n --data '{\"type\":\"A\",\"name\":\"'${URLS[$i]}'\",\"content\":\"'${INTERNET_IP}'\",\"ttl\":120,\"proxied\":false}'\n done\nelse\n echo \"No change: ${INTERNET_IP}\"\n echo \"${NOW_TIME}: No change: ${INTERNET_IP}\" > /home/awin/log/ddns.log\nfi\n\necho \"${NOW_TIME}: Update done\" >> /home/awin/log/ddns.log\n```"}, + {"id":"6184baf71c6585ff","x":-731,"y":620,"width":631,"height":430,"type":"text","text":"## crontab\n### 加入\n使用`crontab -e`,然後加入這一行:\n`*/1 * * * * /home/awin/script/ddns.sh`\n\n### 說明\n![[Pasted image 20240111231507.png]]\n依序是 **分鐘,   小時,   日期,   月份,    星期,   command**\n參數為 0-59,   0-23,   1-31,  1-21,   0-6,   需要執行的command\n**※ 星期參數為 0 代表星期日**\n\n- 【*】:星號,代表任何時刻都接受的意思\n- 【,】:逗號,代表分隔時段。例如:30 9,17 * * * command,代表早上 9 點半和下午五點半都執行 command。\n- 【-】:減號,代表一段時間範圍。例如:15 9-12 * * * command,代表從 9 點到 12 點的每個 15 分都執行 command。\n- 【/n】:斜線,n 代表數字,表示每個 n 單位間隔。例如:*/5 * * * * command,代表每隔 5 分鐘執行一次 command。\n\n■ 還有一些人性化的參數,一次取代全部五個數字參數\n- 【@reboot】 :僅在開機的時候執行一次。\n- 【@yearly】 :一年執行一次,和0 0 1 1 * command效果一樣。\n- 【@annually】:(和@yearly一樣)\n- 【@monthly】:一個月執行一次,和0 0 1 * * command效果一樣。\n- 【@weekly】:一個星期執行一次,和0 0 * * 0 command效果一樣。\n- 【@daily】:每天執行,和0 0 * * * command效果一樣。\n- 【@midnight】:(和@daily一樣)\n- 【@hourly】 :每小時執行,和0 * * * * command效果一樣。\n\n### 範例\n- 每 5 分鐘執行一次:\n - `*/5 * * * *  root    /usr/libexec/atrun`\n- 每 5 小時執行一次\n - `​* */5 * * * root    /usr/libexec/atrun`\n- 每天 AM 5:00 執行指令(星號與星號之間要有空隔)\n - `​00 05   * * *  username /bin/bash /路徑/command`\n- 1 至 20 號每天執行一次\n - ​`0 1 1-20  * * root    /usr/libexec/atrun`\n- 當分針移到第 5 分時,執行此 cron\n - `​5 * * * * root    /usr/libexec/atrun`\n- 當時針移到 1 點 1 分時,執行此 cron\n - ​`1 1 * * * root    /usr/libexec/atrun`\n- 每週一的 1 點 1 分,執行\n - `​1 1 * * 1 root    /usr/libexec/atrun`\n- 2 月 29 日時針到 1 點 1 分,執行\n - ​`1 1 29 2 * root    /usr/libexec/atrun`\n- 8 點到 16 點每 5 分鐘執行一次 cron\n - `​/5 8-16 * * *   root    /usr/libexec/atrun`\n\n### crontab 命令\n#### 啟動\n`- ​**sudo service cron  start**`\n\n#### 重新啟動\n`/etc/init.d/cron restart`\n\n#### 查詢service狀態\n`sudo /etc/init.d/cron status`\n\n#### 編輯 crontab\n`crontab -e`\n\n\n"} ], "edges":[ {"id":"f01be3b2d50be1dd","fromNode":"2379c5036a2ef1af","fromSide":"bottom","toNode":"3a39140e3c8408cf","toSide":"top"}, diff --git a/attachments/Pasted image 20240111231507.png b/attachments/Pasted image 20240111231507.png new file mode 100644 index 0000000000000000000000000000000000000000..53a12de8950ea9c95cfe974f2e775dd02dc69922 GIT binary patch literal 7971 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