顯示具有 freeBSD 標籤的文章。 顯示所有文章
顯示具有 freeBSD 標籤的文章。 顯示所有文章

2022年2月11日 星期五

自訂 Linux 的 Bash Shell 命令提示字串 Prompt

如何在 Linux 或 Unix 操作系統下更改 shell 提示的顏色?如何在 Linux、macOS 或類 Unix 系統上自定義和著色我的 Bash 提示符 PS1

我們可以更改 shell 提示符的顏色,或者在命令提示符下讓工作變得更輕鬆。BASH shell 是 Linux 和 Apple OS X 下的預設的設置。現在讓我們看看在 Linux 或 Unix 系統上使用 bash 時如何更改 shell 提示的顏色。

基本設定方法

Linux 的" Bash Shell 命令提示字串可以透過 PS1 這個環境變數來設定,通常他都是寫在 ~/.bashrc 或是 ~/.bash_profile 這些 Bash 的設定檔中,通常預設的設定會類似這樣:

PS1="\u@\h \W$ "

PS1 的設定中,若以反斜線加上一個特定字母,都有一些特殊意義:

  • \u:表使用者的帳號名稱。
  • \h:主機名稱。
  • \W:目前的工作目錄名稱。

顯示出來的結果會像這樣:

通常剛裝好的 Linux 系統,命令提示字串大概就是像這樣,沒有什麼特別,但是其實它的功能很強大,可以有很多的變化,以下是一些常用的功能介紹。

顯示時間

PS1 環境變數中,您可以使用 $(linux_command) 的方式,直接執行任何的 Linux 指令,下面是一個執行 $(date) 來顯示目前時間的例子。

PS1="\u@\h [$(date +%k:%M:%S)]> "

結果會像這樣:

另一種方式是直接使用 \t,則可以顯示 hh:mm:ss 格式的時間,例如:

PS1="[\t] \u@$(pwd)> "

而 \@ 則是可以顯示 12 小時制的時間:

PS1="[\@] \u@$(pwd)> "

任意指令輸出

如果您對於 shell 的程式設計很熟悉的話,可以在 PS1 插入任何的指令輸出或是變數:

kernel_version=$(uname -r)
PS1="\!|\h|$kernel_version|$? > "

文字顏色

命令提示字串也可以使用彩色的文字:

PS1="\e[0;34m\u@\h \w\e[0m > "

這裡文字的色彩是靠 ANSI escape code 來指定的,\e[0;34m 是顏色指定的開始控制碼,結束是 \e[0m,而在放這中間的所有文字都會是有顏色的,而文字的顏色則是由開始控制碼中的數值來決定:

  • 0 與 1:0 代表正常亮度,1 代表高亮度。
  • 30 與 37:30 + x 所得到的數值可指定前景顏色(x 值與顏色的對應請參考下面的對應表)。
  • 40 與 47:40 + x 所得到的數值可指定背景顏色(x 值與顏色的對應請參考下面的對應表)。
  • 多個數值之間以分號(;)隔開,像這裡的 \e[0;34m 就是指定正常亮度(0),顏色為藍色(34 = 30 + 4),結果會像這樣:

    這是使用高亮度(1)的狀況:

    PS1="\e[1;34m\u@\h \w\e[0m > "

    加上背景的顏色:

    PS1="\e[0;34;47m\u@\h \w\e[0m > "

    使用多種顏色:

    PS1='\e[1;37m\t\e[0m\n\e[1;32m\u\e[1;33m@\e[1;32m\h\e[33m:\e[1;36m$(pwd)\e[1;33m\$\e[0m '

    PS1 特殊字元

    以下這些是在 PS1 中可以使用的特殊字元,您可以用運這些設計自己的命令提示字串。

    • \a:ASCII bell 字元(07)。
    • \d:格式為 Weekday Month Date 的日期(例如 Tue May 26)。
    • \D{format}:將 format 傳給 strftime(3),然後將輸出的結果放進命令提示字串中,如果 format 是空字串,就會使用目前語系的預設的格式,其中的大括號不可以省略。
    • \e:ASCII 跳脫字元(escape character,033)。
    • \h:機器的簡短主機名稱(hostname),只顯示到第一個句點之前。
    • \H:機器的完整主機名稱(hostname)。
    • \j:目前的 shell 所掌控的 jobs 數量。
    • \l:the basename of the shell’s terminal device name。
    • \n:換行。
    • \r:carriage return。
    • \s:the name of the shell, the basename of $0 (the portion following the final slash)。
    • \t:現在時間,24 小時制(HH:MM:SS)。
    • \T:現在時間,12 小時制(HH:MM:SS)。
    • \@:現在時間,12 小時制(HH:MM AM/PM)。
    • \A:現在時間,24 小時制(HH:MM)。
    • \u:目前使用者的使用者名稱(username)。
    • \v:目前的 bash shell 版本(如 2.00)。
    • \V:目前的 bash shell 詳細版本(如 2.00.0)。
    • \w:目前的工作目錄完整路徑,若在 $HOME 中,則以 ~ 顯示。
    • \W:目前的工作目錄名稱,若在 $HOME 中,則以 ~ 顯示。
    • \!:目前指令的歷史紀錄編號。
    • \#:目前指令的編號。
    • \$:如果是 root 管理者,則顯示 #,否則顯示 $。
    • \n:以八進位表示字元,例如 33。the character corresponding to the octal number nnn。
    • \\:反斜線。
    • [ 與 ]:當 PS1 參雜一些無法顯示的字元時,就要用這兩個特殊字元包起來,這樣顯示才會正常,例如所有控制顏色或是格式的控制碼,都要加上這兩個特殊字元,這樣可以避免 bash 在計算提示字元長度時出錯。

    只要善用這些特殊字元,其實就可以讓自己的命令提示字串有許多的變化。

    2021年7月26日 星期一

    dd - 備份與回覆資料的小工具

    Linux 與 freeBSD 系統中的 dd 指令是一個多功能的小工具,可以用於各種的資料拷貝動作:

    • 備份與回復整顆硬碟的資料。
    • 備份與回復原始設備檔案,例如 MBR(master boot record)。
    • 轉換資料格式,例如 ASCII 轉換為 EBCDIC,大小寫轉換等。
    • 建立固定大小的檔案。

    dd 的原意為 data duplicator,但由於 dd 屬於較低階的資料處理工具,通常都會以管理者(root)權限來執行,如果稍有不慎,也很容易造成嚴重的後果(例如整顆硬碟的資料不見等等),所以有些人也把 dd 取名為 data destroyer。許多人在製作 Linux 的 USB 安裝隨身碟的時候,時常也會使用到 dd 指令。

    基本使用方式

    • if=FILE:指定輸入檔案名稱(input file)為 FILE。
    • of=FILE:指定輸初檔案名稱(output file)為 FILE。
    • ibs=BYTES:指定輸入區塊大小(input block size),一次讀取 BYTES 位元組的資料,預設為 512
            位元組。
    • obs=BYTES:指定輸出區塊大小(output block size),一次寫入 BYTES 位元組的資料,預設為
            512 位元組。
    • bs=BYTES:指定 block size,一次讀取與寫入 BYTES 位元組的資料,此選項會覆蓋 ibs 與 obs 的
            設定。
    • cbs=BYTES:一次轉換 BYTES 位元組的資料。
    • count=N:只處理 N 個輸入區塊,每個區塊的大小為 ibs。
    • seek=N:在輸出時跳過輸出檔案的前 N 個區塊,每個區塊的大小為 obs。
    • skip=N:在輸入時跳過輸入檔案的前 N 個區塊,每個區塊的大小為 ibs。
    • conv=CONVS:指定資料的轉換選項,如果一次要指定多種轉換,則以逗點分隔。

    以下是各種可用的轉換:

    • ascii:EBCDIC 轉 ASCII。
    • ebcdic:ASCII 轉 EBCDIC。
    • ibm:ASCII 轉 alternate EBCDIC。
    • block:將每一個區塊的資料結尾的換行字元替換為空白,並以空白將整個區塊補足 cbs 位元組。
    • unblock:將每個區塊結尾的空白字元替換為換行字元。
    • lcase:將大寫字母轉換成小寫。
    • ucase:將小寫字母轉換成大寫。
    • swab:將每一對輸入的位元組交換。
    • sync:將每一個輸入的區塊以 NUL 補足至 ibs 位元組的大小,如果是在 block 或是 unblock 的轉換
            中,則以空白字元來補足。
    • nocreat:不要建立輸出檔案。
    • notrunc:不要將輸出檔案截短。
    • noerror:發生錯誤時還是繼續執行。
    • fdatasync:讓資料同步實體寫入硬碟,不要留在緩衝區中。
    再次提醒您,若以管理者權限執行 dd 時,請再三確認您所執行的指令內容是否正確,執行錯誤的指令可能導致整個系統與資料的損毀!

    備份整顆硬碟

    將 /dev/sda 所有的資料寫入 /dev/sdb:

    sudo dd if=/dev/sda of=/dev/sdb

    if 參數指定的是輸入檔案(input file),而 of 參數指定的是輸出檔案(output file),這行指令會將 /dev/sda 這顆硬碟的資料讀出來,然後寫進 /dev/sdb 這顆硬碟。

    在整個過程中如果出現讀取錯誤的話,dd 就會停止執行,如果想要讓 dd 在出現讀取錯誤時還是繼續拷貝資料的話,就要加上 conv=noerror 參數,這個選項通常在備份資料時會使用到,另外加上 sync 可以讓 dd 以 synchronized I/O 的方式備份資料:

    sudo dd if=/dev/sda of=/dev/sdb conv=noerror,sync

    建立硬碟的備份影像檔

    備份硬碟資料除了拿兩顆硬碟對拷之外,也可以直接將整顆硬碟的資料製作成影像檔,以這種方式備份資料會更有彈性:

    sudo dd if=/dev/hda of=~/hdadisk.img

    這行指令會將 /dev/sda 這顆硬碟的資料讀出來,儲存至 ~/hdadisk.img 這個影像檔中。

    從備份影像檔回復硬碟資料

    如果要以影像檔回復硬碟的資料,就執行:

    sudo dd if=hdadisk.img of=/dev/hdb

    這樣就會把 hdadisk.img 影像檔中的資料回復至 /dev/sdb 這顆硬碟(原本 /dev/sdb 硬碟中的所有資料會被覆蓋掉,請小心使用)。

    備份磁碟分割區

    如果只要備份單一個磁碟分割區,可以使用:

    sudo dd if=/dev/hda1 of=~/partition1.img

    兩個磁碟分割區對拷:

    sudo dd if=/dev/sda1 of=/dev/sdb1 bs=4096 conv=noerror,sync

    這樣會將 /dev/sda1 的資料同步至 /dev/sdb1,使用前請確認 /dev/sdb1 分割區大小至少要比 /dev/sda1 大。

    備份 CD/DVD 光碟

    將光碟片放進光碟機之後,就可以使用這樣的指令將光碟整個備份成 ISO 檔:

    sudo dd if=/dev/cdrom of=tgsservice.iso bs=2048

    如果您放進光碟片時,系統會自動掛載,那麼在使用 dd 備份之前,建議可以先將光碟卸載,避免不必要的光碟讀取動作。

    壓縮資料

    如果資料很大,可以配合 gzip 將資料壓縮起來,直接輸出成壓縮過的影像檔:

    sudo dd if=/dev/sda | gzip > sdadisk.img.gz

    而要從壓縮過的影像檔回復資料,可以使用:

    sudo gzip -dc sdadisk.img.gz | dd of=/dev/sda

    MBR 的備份與回復

    如果資料很大,可以配合 gzip 將資料壓縮起來,直接輸出成壓縮過的影像檔:

    sudo dd if=/dev/sda | gzip > sdadisk.img.gz

    而要從壓縮過的影像檔回復資料,可以使用:

    sudo gzip -dc sdadisk.img.gz | dd of=/dev/sda

    MBR 的備份與回復

    備份 MBR(master boot record):

    sudo dd if=/dev/sda of=mbr.img bs=446 count=1

    回復 MBR:

    sudo dd if=mbr.img of=/dev/sda

    查看 MBR 內容:

    sudo dd if=/dev/hda of=mbr.bin bs=512 count=1
    od -xa mbr.bin

    ASCII 與 EBCDIC 轉換

    將 ASCII 轉換為 EBCDIC:

    dd if=textfile.ascii of=textfile.ebcdic conv=ebcdic

    將 EBCDIC 轉換為 ASCII:

    dd if=textfile.ebcdic of=textfile.ascii conv=ascii

    大小寫轉換

    轉換為大寫:

    dd if=file1 of=file2 conv=ucase

    轉換為小寫:

    dd if=file1 of=file2 conv=lcase

    建立固定大小的檔案

    建立一個 10MB 大小的檔案:

    dd if=/dev/zero of=file1 bs=10485760 count=1

    這裏的 block size 的計算方式為 10*1024*1024 = 10MB。

    修改檔案內容

    將檔案開頭的 512 bytes 改為 null:

    dd if=/dev/zero of=file1 bs=512 count=1 conv=notrunc

    這裡的 notrunc 參數代表不要將輸出檔案截短,只取代開頭的前 512 bytes,其餘內容不變。假設 file1 不存在,那麼這行指令就會建立一個 512 bytes 的 file1 檔案。

    使用 dd 指令將 Linux ISO 檔製作成 Live USB 隨身碟

    這裡介紹如何在 Linux 中將一般 Linux 的 ISO 檔用 dd 指令寫入 USB 隨身碟,製作成 Live USB 或是安裝系統用的隨身碟。

    大部分的 Linux 發行版都會以 ISO 映像檔的形式提供使用者下載,以前大家都會將 ISO 映像檔用燒錄成 CD 或 DVD 安裝光碟,再放進機器的光碟機中安裝系統,不過現在光碟片已經逐漸被 USB 隨身碟所取代了,有些新電腦甚至已經不再配有光碟機,以 USB 隨身碟的方式來安裝系統已經成為主流。

    如果手上沒有可用的 USB 隨身碟,也可以拿 SD 或 MicroSD 等記憶卡,接上讀卡機之後也可以作為安裝 Linux 用的儲存媒體,其使用方式跟一般的 USB 隨身碟一模一樣。

    STEP 1

    將 USB 隨身碟插入 Linux 的電腦中,查詢一下目前所有硬碟與 USB 隨身碟的狀況。

    lsblk

    NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda           8:0    1  7.6G  0 disk 
    └─sda1        8:1    1  7.6G  0 part /media/pi/ESD-USB
    sdc           8:33   1  7.4G  0 disk 
    └─sdc1        8:33   1  7.4G  0 part /media/pi/disk
    mmcblk0     179:0    0 14.9G  0 disk 
    ├─mmcblk0p1 179:1    0   63M  0 part /boot
    └─mmcblk0p2 179:2    0 14.8G  0 part /

    一般來說在 USB 隨身碟插入 Linux 系統之後,系統會自動將其掛載,我們必須先從這個列表中找出我們要使用的 USB 隨身碟是那一個,最簡單的方式就是從這裡的 SIZE 來看,若看不出來的話,就打開其掛載的目錄,實際看一下裡面的內容。

    這裡我所要使用的 USB 隨身碟是掛載在 /media/pi/disk 這一個位置,而其對應的硬碟路徑則是 /dev/sdc,找到這個代號之後,就可以繼續下一步了。

    在判斷磁碟代號的時候,要非常小心,絕對不可以搞錯,如果誤判磁碟代號的話,在執行後續的資料寫入動作時,就會可能造成整個系統損毀。

    STEP 2

    從 Linux 的桌面環境下卸載 USB 隨身碟(在檔案總管按下退出的按鈕),或是使用指令卸載:

    umount /media/pi/disk

    卸載後再次確認一下卸載的 USB 隨身碟是否正確:

    lsblk

    STEP 3

    使用 dd 指令將 Linux 的 ISO 映像檔寫入 USB 隨身碟:

    sudo dd if=ubuntu-16.10-desktop-amd64.iso of=/dev/sdc bs=1M

    這個指令是將整個 ISO 檔的內容寫入 USB 隨身碟,所以要等比較久一點,在寫入的期間並不會有任何輸出訊息,完成後會出現類似這樣的訊息:

    /dev/sdc bs=1M
    1520+0 records in
    1520+0 records out
    1593835520 bytes (1.6 GB) copied, 493.732 s, 3.2 MB/s

    這樣就完成了 USB 隨身碟的製作了,接著就可以將隨身碟拔下來,插入要安裝 Linux 系統的機器進行安裝了。

    How to write FreeBSD image to USB disk for installation using dd command

    FreeBSD is an open-source and free Unix-like operating system descended from the Berkeley Software Distribution (BSD). This quick tutorial explains how to download and prepare the USB stick/pen boot drive to install FreeBSD 12.2 or 13.x to install FreeBSD using the target computer’s USB port.

    Head over to the FreeBSD download page and make sure you download the latest stable bootable version. I will download *-memstick.img*, which contains all of the files needed to install FreeBSD, its source, and the Ports Collection using a USB stick and boot the system.

    STEP 1 - Downloading FreeBSD image

    use the wget command you can download a file with curl too:

    wget
    https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/12.2/FreeBSD-12.2-RELEASE-amd64-memstick.img.xz

    Session :

    --2020-12-30 00:46:08--  https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/12.2/FreeBSD-12.2-RELEASE-amd64-memstick.img.xz
    Resolving download.freebsd.org (download.freebsd.org)... 203.80.16.151, 2404:a8:3ff::15:0
    Connecting to download.freebsd.org (download.freebsd.org)|203.80.16.151|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 687961180 (656M) [application/octet-stream]
    Saving to: 'FreeBSD-12.2-RELEASE-amd64-memstick.img.xz'
                 
    FreeBSD-12.2-RELEAS 100%[==================>] 656.09M  8.26MB/s    in 81s     
                 
    2020-12-30 00:47:29 (8.09 MB/s) - 'FreeBSD-12.2-RELEASE-amd64-memstick.img.xz' saved [687961180/687961180]

    Grab checksum file to verify boot disk image :

    wget
    https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/12.2/CHECKSUM.SHA512-FreeBSD-12.2-RELEASE-amd64

    Verify integrity of a file :

    sha512sum --ignore-missing -c CHECKSUM.SHA512-FreeBSD-12.2-RELEASE-amd64"

    We should see something as follows :

    FreeBSD-12.2-RELEASE-amd64-memstick.img.xz: OK

    For FreeBSD 13.x :

    Download FreeBSD 13 by visiting official page:

    $ wget https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/13.0/FreeBSD-13.0-RELEASE-amd64-memstick.img.xz
    $ wget https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/13.0/CHECKSUM.SHA512-FreeBSD-13.0-RELEASE-amd64
    $ sha512sum --ignore-missing -c CHECKSUM.SHA512-FreeBSD-13.0-RELEASE-amd64
    FreeBSD-13.0-RELEASE-amd64-memstick.img.xz: OK
    STEP 2 - Finding out your USB flash drive name

    Insert the USB pen into your computer’s USB port and run the dmesg to see USB device name :

    dmesg

    The output indicates that I am using /dev/sda on Linux :

    [ 2314.466297] usb 1-2: new high-speed USB device number 9 using xhci_hcd
    [ 2314.629772] usb 1-2: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 0.01
    [ 2314.629779] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [ 2314.629782] usb 1-2: Product: DataTraveler 3.0
    [ 2314.629786] usb 1-2: Manufacturer: Kingston
    [ 2314.629788] usb 1-2: SerialNumber: C81F660E262EF1713606D2C2
    [ 2314.655320] usb-storage 1-2:1.0: USB Mass Storage device detected
    [ 2314.655377] scsi host0: usb-storage 1-2:1.0
    [ 2314.655474] usbcore: registered new interface driver usb-storage
    [ 2314.656962] usbcore: registered new interface driver uas
    [ 2315.663917] scsi 0:0:0:0: Direct-Access     Kingston DataTraveler 3.0      PQ: 0 ANSI: 6
    [ 2315.664256] sd 0:0:0:0: Attached scsi generic sg0 type 0
    [ 2315.665411] sd 0:0:0:0: [sda] 30218842 512-byte logical blocks: (15.5 GB/14.4 GiB)
    [ 2315.665723] sd 0:0:0:0: [sda] Write Protect is off
    [ 2315.665725] sd 0:0:0:0: [sda] Mode Sense: 4f 00 00 00
    [ 2315.665939] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
    [ 2315.682431] sda: sda1 sda2
    [ 2315.684945] sd 0:0:0:0: [sda] Attached SCSI removable disk
    [ 2316.154272] ISO 9660 Extensions: Microsoft Joliet Level 3
    [ 2316.155734] ISO 9660 Extensions: Microsoft Joliet Level 3
    [ 2316.159081] ISO 9660 Extensions: RRIP_1991A

    Your device name will vary. For instance, here is what reported on my FreeBSD system (/dev/da0) :

    ugen0.3: <SanDisk Ultra> at usbus0
    umass0 on uhub2
    umass0: <SanDisk Ultra, class 0/0, rev 2.10/1.00, addr 2> on usbus0
    umass0: SCSI over Bulk-Only; quirks = 0xc100
    umass0:8:0: Attached to scbus8
    da0 at umass-sim0 bus 0 scbus8 target 0 lun 0
    da0: <SanDisk Ultra 1.00> Removable Direct Access SPC-4 SCSI device
    da0: Serial Number 4C531003510422116045
    da0: 40.000MB/s transfers
    da0: 59232MB (121307136 512 byte sectors)
    da0: quirks=0x2<lNO_6_BYTE>

    Make sure you extract .xz file as follows :

    xz -dv FreeBSD-12.2-RELEASE-amd64-memstick.img.xz

    For FreeBSD 13.x image :

    xz -dv FreeBSD-13.0-RELEASE-amd64-memstick.img.xz

    FreeBSD-13.0-RELEASE-amd64-memstick.img.xz (1/1)
    100 %     661.7 MiB / 1,040.4 MiB = 0.636   173 MiB/s       0:05
    Step 3 - Writing FreeBSD image to USB flash drive

    Warning:
    Be careful with the correct USB pen device/drive name. The wrong device name will destroy the existing data on the specified USB drive.

    Say, If your USB stick is /dev/sda under Linux, you would run :

    # Find mounted partition for /dev/sda #
    $ mount | grep '/dev/sda'
    # Unmount all mounted partition for /dev/sda #
    $ sudo umount /dev/sda2
    # Write it #
    $ sudo dd if=FreeBSD-12.2-RELEASE-amd64-memstick.img \
    of=/dev/sda bs=1M conv=sync status=progress

    For FreeBSD 13.x :

    sudo dd if=FreeBSD-13.0-RELEASE-amd64-memstick.img \
    of=/dev/sda bs=1M conv=sync status=progress

    If your USB flash stick name is /dev/da0 under FreeBSD, you would run :

    # Find mounted partition for /dev/da0 #
    $ mount | grep '/dev/da0'
    # Unmount all mounted partition for /dev/da0 #
    $ sudo umount /dev/da0
    # Write it #
    $ sudo dd if=FreeBSD-12.2-RELEASE-amd64-memstick.img \
    of=/dev/da0 bs=1M conv=sync
    Step 4 - Installing FreeBSD 12.2

    Insert the newly created USB pen drive with FreeBSD installer in the target computer. Please turn it on. Make sure you boot from USB media. For example :

    Once booted, you will see the FreeBSD boot menu followed by FreeBSD installer :

    Now follow the on-screen instructions to install the FreeBSD operating system.