跳至主要內容

SSH 隧道

這篇備忘錄記錄了 SSH 隧道。

什麼是 SSH 隧道?​

資訊

SSH 隧道(也稱為 SSH 端口轉發)是一種通過 SSH 連接在客戶端和服務器之間創建加密隧道的方法。它允許你將網絡流量從一個端口轉發到另一個端口,即使這些端口原本無法直接訪問。

SSH 隧道有三種類型:

  1. 本地端口轉發 (Local Port Forwarding):將本地機器的端口轉發到遠端機器的端口。
  2. 遠端端口轉發 (Remote Port Forwarding):將遠端機器的端口轉發到本地機器的端口。
  3. 動態端口轉發 (Dynamic Port Forwarding):創建一個 SOCKS 代理,允許通過 SSH 連接動態轉發多個目的地。

1. 本地端口轉發 (Local Port Forwarding)​

用途:訪問防火牆後的遠端服務。

語法:

ssh -L [本地端口]:[目標主機]:[目標端口] [SSH用戶]@[SSH服務器]

範例: 假設你本地機器上的 8080 端口,通過 SSH 服務器(ssh.example.com)將流量轉發到遠端機器(remote.example.com)的 80 端口。

ssh -L 8080:remote.example.com:80 [email protected]

現在,你可以通過訪問本地的 localhost:8080 來訪問 remote.example.com 上的網頁服務。

2. 遠端端口轉發 (Remote Port Forwarding)​

用途:讓遠端機器訪問本地機器上的服務。

語法:

ssh -R [遠端端口]:[目標主機]:[目標端口] [SSH用戶]@[SSH服務器]

範例: 假設你希望遠端 SSH 服務器上的用戶可以通過 localhost:9000 訪問你本地機器上的 3000 端口(例如一個 Web 應用)。

ssh -R 9000:localhost:3000 [email protected]

現在,連接到 ssh.example.com 的用戶可以通過訪問 localhost:9000 來訪問你的本地服務。

3. 動態端口轉發 (Dynamic Port Forwarding)​

用途:創建一個 SOCKS 代理,用於繞過防火牆或匿名上網。

語法:

ssh -D [本地端口] [SSH用戶]@[SSH服務器]

範例: 在本地機器上創建一個 SOCKS 代理,監聽 8181 端口。

ssh -D 8181 [email protected]

然後,你需要將你的瀏覽器或其他應用程式配置為使用 localhost:8181 作為 SOCKS 代理。所有通過這個代理的流量都將通過 ssh.example.com 加密隧道轉發。

保持隧道開啟​

如果你希望 SSH 隧道在後台保持運行,可以使用 -N(不執行遠端命令)和 -f(在後台運行)選項:

ssh -fN -L 8080:remote.example.com:80 [email protected]

總結​

SSH 隧道是一個非常強大且靈活的工具,它提供了安全地訪問網絡服務、繞過網絡限制以及增強隱私保護的方法。了解並熟練使用不同類型的端口轉發,可以大大提高你的網絡操作效率和安全性。

如何安裝 Powerline

安裝 Go​

安裝 Go 以便安裝 powerline-go。

brew install go

安裝 Powerline-go​

go get -u github.com/justjanne/powerline-go

設定

Bashrc​

用 Vim 或 nano 開啟 ~/.bashrc,並加入以下內容。

GOPATH=$HOME/go
function _update_ps1() {
PS1="$( $GOPATH/bin/powerline-go -newline -error $? )"
}
if [ "$TERM" != "linux" ] && [ -f "$GOPATH/bin/powerline-go" ]; then
PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND"
fi

執行 source ~/.bashrc 套用變更。

字型

到這裡應該就完成了,但可能會有字元編碼問題。 您需要設定對應 Powerline 的字型。 在 Windows 上,可以使用 Cascadia Code PL 或 Cascadia Mono PL。

推薦使用 https://github.com/yuru7/PlemolJP/ 的 PlemolJP。 從 https://github.com/yuru7/PlemolJP/releases 下載,點擊 PlemolJP_NF_vX.X.X.zip,下載後解壓縮並安裝字型。 將字型設定為 PlemolJP35 Console NF。

避免在 Arduino 中使用 delay()

在 Arduino 中使用 delay() 會導致等待期間無法執行任何其他動作。 這裡使用 millis() 建立了一個以 1 秒週期閃爍 LED 的程式。

  1. 使用 millis() 取得時間,除以間隔後將結果指派給 t。
  2. 比較前一個 t 與新的 t,若不同則執行函式。

範例

unsigned long t = 0, ot;

void sетуp(){
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
ot = t;
t = millis() / 500;
if(ot != t){
if(t % 2){
digitalWrite(LED_BUILTIN, LOW);
}else{
digitalWrite(LED_BUILTIN, HIGH);
}
}
}

不需螢幕設定 Raspberry Pi

本指南說明如何在不需要螢幕的情況下設定 Raspberry Pi。

  • 需要可連接網路線進行有線連線的 Raspberry Pi 裝置。
  • 需要一台電腦來操作 Raspberry Pi。

安裝 Raspberry Pi Imager,選擇 OS。選擇要寫入的 micro SD 卡,然後點擊 WRITE。

Raspberry Pi Imager

設定

啟用 SSH​

啟用 SSH 可讓您遠端操作 Raspberry Pi。

重新插入 micro SD 卡,並在根目錄中直接建立一個名為 ssh 的文字檔案,不需要副檔名。

Raspberry Pi enable SSH

啟用 VNC​

開啟 config.txt,取消以下幾行的註解並儲存:

framebuffer_width=1280
framebuffer_height=720

Raspberry Pi enable VNC

開機​

將 micro SD 卡插入 Raspberry Pi,連接電源並開機。

透過 SSH 連線​

使用主機名稱 raspberrypi、使用者名稱 pi、密碼 raspberry 進行連線。

Raspberry Pi connect SSH

更新套件​

sudo apt update
sudo apt upgrade -y

啟用 VNC​

sudo raspi-config

Raspberry Pi config

選擇 3 Interface Options,然後選 P3 VNC,再選 YES。按 Finish 關閉。

透過 VNC 連線​

Raspberry Pi VNC viewer

使用與 SSH 相同的使用者名稱和密碼。

Raspberry Pi VNC connected

啟用 Wi-Fi​

透過 VNC 啟用 Wi-Fi 後,就不再需要有線連線,只需電源即可操作 Raspberry Pi。

透過 rbenv 安裝的 Ruby 在 Webrick 上 CGI 無法運作的解決方法

在瀏覽器中執行 CGI 時,發生以下錯誤: /usr/bin/env: 'ruby': No such file or directory

#!/usr/bin/env ruby

# ...

原因

$PATH 未設定。

#!/usr/bin/env bash

echo -ne "Content-type: text/html\n\n"
echo $PATH

執行後會顯示:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

這表示包含 Ruby 的目錄不在其中。

解決方法

使用 :CGIPathEnv 設定 Ruby 路徑。

srv = WEBrick::HTTPServer.new({
:DocumentRoot => "./site/",
:Port => 8080,
:CGIPathEnv => ENV["PATH"]
})

如何建立 gem

建立模板​

bundle gem <GEM Name> -t
cd <GEM Name>

編輯 Gemspec​

  1. 開啟 <GEM Name>.gemspec。
  2. 編輯 spec.summary、spec.description、spec.homepage,
  3. 將首頁 URL 寫入 spec.metadata["allowed_push_host"]
  4. 將 Gem 的頁面寫入 spec.homepage
  5. 將儲存庫 URL 寫入 spec.metadata["source_code_uri"]
  6. 將 changelog.md 的 URL 寫入 spec.metadata["changelog_uri"]

至少需要設定上述內容。

推送到 GitHub 並安裝​

git init
git add .
git commit -m First Commit
git remote add origin [email protected]:<username>/<GEM Name>.git
git push -u origin master

安裝​

gem install specific_instal
gem specific_install -l "git://github.com/<username>/<GEM Name>.git"

Gemfile​

gem "<GEM Name>", github: "<username>/<GEM Name>.git", branch: :main

TIV

這篇備忘錄記錄了 TIV。

資訊

TIV 是一個簡單的命令行影像查看器,它允許你在終端中直接預覽影像,無需打開圖形界面應用程式。它通常與 fzf 和其他命令行工具結合使用,以提高工作效率。

安裝 TIV​

TIV 是一個用 Go 語言編寫的工具,你可以從其 GitHub 儲存庫編譯安裝,或者使用預編譯的二進制文件。

從源碼安裝 (需要 Go 環境)​

  1. 安裝 Go:如果你還沒有安裝 Go,請參考 Go 官方網站 進行安裝。

  2. 克隆 TIV 儲存庫:

    git clone https://github.com/ngryman/tiv.git
    cd tiv
  3. 編譯並安裝:

    go install .

    這會將 tiv 可執行文件安裝到你的 $GOPATH/bin 目錄中。請確保該目錄已添加到你的 $PATH 環境變量中。

使用預編譯的二進制文件 (推薦)​

你可以在 TIV 的 GitHub Releases 頁面 下載適用於你系統的預編譯二進制文件。

  1. 下載:選擇最新版本,下載對應你操作系統的壓縮包。

  2. 解壓縮:將下載的文件解壓縮到你喜歡的位置。

  3. 移動到 PATH:將解壓縮後的可執行文件(例如 tiv)移動到你的 $PATH 中的任何目錄(例如 /usr/local/bin)。

    sudo mv tiv /usr/local/bin/

使用 TIV​

TIV 的基本用法是直接在命令行中指定影像文件路徑:

tiv image.jpg

它會嘗試在你的終端中渲染影像。效果會根據你的終端類型和配置有所不同。

結合 fzf 使用​

TIV 與 fzf(一個模糊查找器)結合使用時非常強大,可以快速預覽多個影像:

find . -type f -name "*.png" -o -name "*.jpg" | fzf --preview 'tiv {}'

這個命令會:

  1. 使用 find 查找當前目錄下的所有 .png 和 .jpg 文件。
  2. 將這些文件列表傳給 fzf。
  3. fzf 會顯示一個可搜索的列表,並在預覽窗口中實時顯示選定文件的 TIV 預覽。

注意事項​

  • 終端支援:TIV 的渲染效果很大程度上取決於你的終端模擬器是否支持 256 色或真彩色。某些終端可能無法正確顯示影像。
  • 影像大小:由於終端字符的限制,顯示的影像解析度會降低。TIV 主要用於快速預覽,而不是高質量查看。
  • 性能:對於非常大的影像文件,渲染可能會比較慢。

總結​

TIV 是一個實用的命令行工具,它為那些喜歡在終端中工作的人提供了一種快速預覽影像的方式。結合 fzf 等工具,它可以極大地提升你的命令行工作流程效率。

GCD 程式

這篇筆記記錄了 GCD(最大公約數)的 C 語言程式。

什麼是 GCD?​

資訊

GCD(Greatest Common Divisor),中文稱為最大公約數,是指兩個或多個整數共有的約數中最大的一個。

例如,24 和 36 的公約數有 1、2、3、4、6、12,其中最大的公約數是 12。

歐幾里得演算法 (Euclidean Algorithm)​

計算 GCD 最常見且有效的方法是歐幾里得演算法。其原理基於以下定理:

$$ \gcd(a, b) = \gcd(b, a \bmod b) $$

當 $b = 0$ 時,$\gcd(a, 0) = a$。

C 語言程式碼實現​

遞迴版本:

// gcd.c
int gcd(int a, int b){
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}

非遞迴版本:

// gcd_iterative.c
int gcd_iterative(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}

測試程式​

#include <stdio.h>

// 遞迴版本的 GCD 函數
int gcd(int a, int b){
return !b ? a : gcd(b, a % b);
}

// 非遞迴版本的 GCD 函數
int gcd_iterative(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}


int main(void){
printf("GCD(24, 36) = %d
", gcd(24, 36)); // 輸出 12
printf("GCD_iterative(24, 36) = %d
", gcd_iterative(24, 36)); // 輸出 12
printf("GCD(48, 18) = %d
", gcd(48, 18)); // 輸出 6
printf("GCD_iterative(48, 18) = %d
", gcd_iterative(48, 18)); // 輸出 6
return 0;
}

總結​

GCD 是數論中的一個基本概念,歐幾里得演算法提供了一種高效的計算方法。無論是遞迴還是非遞迴實現,其核心思想都是利用模運算將問題規模不斷縮小,直到其中一個數變為零。

安裝 ImageMagick

這篇筆記記錄了在 Ubuntu 上安裝 ImageMagick 的方法。

資訊

ImageMagick 是一個開源的軟體套件,用於創建、編輯、組合或轉換點陣圖影像。它支持多種影像格式,包括 PNG、JPEG、GIF、TIFF 和 PDF。

安裝步驟​

1. 更新套件列表​

在安裝任何新軟體之前,最好先更新系統的套件列表:

sudo apt update
sudo apt upgrade

2. 安裝 ImageMagick​

直接使用 apt 命令安裝 ImageMagick:

sudo apt install imagemagick

這會安裝 ImageMagick 的核心工具和庫。如果你還需要開發庫,可以安裝 imagemagick-dev:

sudo apt install imagemagick-dev

3. 驗證安裝​

安裝完成後,你可以通過檢查 ImageMagick 的版本來驗證是否成功:

convert --version

或

magick --version

你應該會看到類似以下的輸出:

Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: DPC HDRI OpenMP
Delegates (built-in): bzlib djvu fftw fontconfig freetype gslib heic jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png raw rsvg tiff webp wmf x xml zlib

4. 基本使用範例​

將 JPEG 影像轉換為 PNG 格式:

convert input.jpg output.png

調整影像大小:

convert input.jpg -resize 50% output_resized.jpg

添加文字到影像:

convert input.jpg -gravity South -pointsize 36 -fill white -annotate 0 'Hello, ImageMagick!' output_text.jpg

常見問題和故障排除​

  • 權限問題:如果你在執行 ImageMagick 命令時遇到權限錯誤,請確保你對輸入和輸出文件有讀寫權限。
  • 文件格式不支持:如果轉換失敗,可能是因為缺少某些文件格式的支援。檢查 convert --version 的輸出中的 "Delegates" 部分,看看是否包含了你需要的格式。如果沒有,可能需要安裝額外的庫(例如 libjpeg-dev, libpng-dev)。
  • Policy 問題:在某些情況下,ImageMagick 的預設安全策略可能會限制某些操作,例如處理 PDF 文件。這通常可以通過編輯 /etc/ImageMagick-6/policy.xml 文件來解決,但請謹慎操作。

總結​

ImageMagick 是一個功能強大的影像處理工具,通過上述步驟可以輕鬆地在 Ubuntu 上安裝和使用它。它提供了豐富的命令行工具,可以滿足各種影像處理需求。