跳至主要內容

在 Windows 上停用 OpenSSH 的密碼驗證

開啟具有系統管理員權限的終端機

編輯設定檔需要系統管理員權限,請以系統管理員身份開啟終端機。

在終端機圖示上按右鍵,選擇「以系統管理員身份執行」。

image

image

在終端機中開啟設定檔

執行以下命令:

notepad C:\ProgramData\ssh\sshd_config

image

編輯設定檔

- # PasswordAuthentication yes
+ PasswordAuthentication no

image

變更為

image

並儲存變更。

重新啟動 SSH 伺服器

返回終端機,執行以下命令以重新啟動 SSH 伺服器:

Restart-Service sshd

連線測試

測試設定是否已生效。

執行以下命令,若看到以下訊息:

ssh localhost
user@localhost: Permission denied (publickey,keyboaard-interactive).

即表示設定正確。

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