Windows Termianl 基於SSH存取樹莓派(SSH設定與JSON基本語法)

2020-08-10 01:05:44

之前玩樹莓派4B都是藉助於顯示屏利用圖形介面來控制,但是因爲暑假在家只有一臺顯示器,平時連線着筆記型電腦,每次想要偵錯都需要拔插HDMI線,很不方便;平時用SSH存取樹莓派都是藉助於putty,但是那個介面實在是太醜陋了,最近正巧又發現了Windows Terminal這個軟體屬實不錯,可以整合各種終端,介面現代化,可定製程度高,於是想到能不能藉助於SSH存取樹莓派呢?

putty可以用SSH存取樹莓派,Windows Terminal可以用SSH存取其他Linux系統,理論上應該是可以的。下午藉助於Google,加上自己的不斷偵錯,終於成功的用Windows Terminal 存取樹莓派,寫下這一篇部落格來記錄自己在這一過程中學到的新知識,以及出現的問題和問題的解決方案,供自己以後查閱以及網際網路上的廣大朋友們參考。

主要包括兩部分的學習SSH設定以及JSON的基本語法規則整理。

爲了方便記錄,本文中操控樹莓派使用的Terminal全部使用Windows Terminal完成,如圖是連線成功後的介面。
在这里插入图片描述

樹莓派的SSH設定

樹莓派開啓ssh的方法有很多,在無桌面系統和有桌面系統的情況下都可以開啓:

樹莓派開啓SSH

無桌面系統開啓ssh

將TF卡取下,在boot目錄下建立文字文件,命名爲ssh,去掉txt檔案後綴,儲存成純檔案格式。

樹莓派通電開機之後,會自動開啓ssh。這個ssh檔案是臨時檔案,再次取下TF卡開啓boot目錄的話,檔案會自動刪除。

有桌面系統開啓ssh

  1. 左面上左上角點選樹莓派LOGO>偏好設定(Preferences)>Raspberry Pi Configuration>Interfaces>SSH 服務 點選Enable。ssh服務就已經開啓。

  2. 命令列輸入

    Pi@raspberry:~$ sudo rasp-config
    

    在「5 interfacing Options」選項中將「P2 SSH」enabled,Finish之後重新啓動。這種方法也可以開啓ssh服務。

設定樹莓派固定IP

用SSH登錄樹莓派有一個問題,因爲我的樹莓派是用Wlan直接連線上網的,所以每一次關機開機之後都有可能會改變IP地址,這樣呼叫起來要每一次都開啓Windows Terminal的設定檔案修改,比較麻煩,所以這裏我修改系統檔案使樹莓派用固定IP上網。

輸入"ifconfig"可以檢視樹莓派的IP資訊。

在这里插入图片描述

輸入sudo nano /etc/dhcpcd.conf,用vim編輯檔案,拖到檔案最下方之後在如圖所示的地方,將#號去掉,並修改。

interface wlan0
static ip_address=192.168.1.107/24
static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=192.168.1.1
static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

wlan0代表無線上網,ip_adress對應的是ip地址,routers代表閘道器地址。將ip地址和閘道器地址修改好,儲存之後重新啓動,ip地址就不再改變。
在这里插入图片描述

Windows Terminal設定

最近發現Windows Terminal這個軟體,可以定製外觀,整合了多個終端,確實是很不錯。設定部分沒有圖形介面,需要靠修改JSON檔案來完成。詳細調理的設定規則可以參考官方的文件,已經寫的很明白了,這裏我只寫我用到的部分。

官方GitHub連線

Windows Terminal setting 修改官方說明-Github

Windows Terminal 官方文件-GitHub

JSON

JSON是JavaScript物件表示法(JavaScript Object Notation)

最近除去玩樹莓派,還試着將Arduino的程式設計搬到了VScode上,於是就需要學習閱讀JSON檔案,恰巧Windows Terminal的設定是依靠JSON完成的,所以學習JSON可以同時服務於兩個地方。這裏我們只需呀用到簡單的JSON規則即可。

json基本語法規則

  • 數據在名稱/值對中
  • 數據由都好分割
  • 物件放在大括號裡
  • 陣列放在中括號裡

setting.json 檔案結構

{
    "profiles":
    {
        "defaults":
        {
        },
        "list":
        [
        ]
    },
    "schemes": [
    ],
    "keybindings":
    [

    ]
}

可以看到,整個文件是一個物件,包含三個陣列,profiles,schemes和keybindings

其中profiles是環境的設定,這裏預設已經載入了Powershell、cmd和Azure Cloudshell。如果你的系統中裝有WSL,他也會自動檢測到並且新增。除此之外,你還可以自定義終端,比如Git bash和我們今天用到的SSH遠端伺服器。

schemes可以設定配色方案,供以環境設定過程中呼叫。

keybindings則可以設定系結快捷鍵。

除此之外,在第一層大括號裏面可以新增全域性屬性。

具體的詳細說明可以參考官方的:Windows Terminal setting 修改官方說明-Github

SSH設定

{
	"guid": "{99BA5433-DF5F-A898-C8E0-78B8BA55F251}",
    "hidden": false,
    "name": "RaspberryPi",
    "icon" : "F:\\WindowsTerminal\\Raspi-PGB001.webp",
    "commandline":"ssh [email protected] -p 22",
}

以我的設定爲例:

  • guid是全域性唯一識別符號,一定要是獨一無二的,可以直接搜尋線上guid生成得到一串數位。
  • hidden決定是否隱藏該環境的入口,如果選擇Ture,那麼在下拉式選單中就找不到這個環境了。
  • name是我們設定的環境的名字,這裏要連線樹莓派,就命名爲RaspberryPi。
  • icon設定圖示,這裏我使用的是圖示的絕對路徑。
  • commandline是命令,這裏用的是ssh的命令,pi是要存取的使用者名稱,@後面是我分配給他的ip地址,-p表示存取的port ,22是ssh預設的port(如果你用Putty存取樹莓派,選擇ssh協定的預設埠也是22)

將這一部分新增上之後Ctrl+S,再開啓下拉式選單就能夠看到RaspberryPi環境已經被我們新增。

SSH存取樹莓派

如果之前的設定全部都正確,沒有填錯或者漏掉什麼步驟,那麼開啓環境之後稍等片刻,可以看到terminal跳數如下字樣:

Could not create directory ‘C:\Users\\345\274\240\345\255\220\350\275\251/.ssh’.
The authenticity of host ‘192.168.1.107 (192.168.1.107)’ can’t be established.
ECDSA key fingerprint is SHA256:dSwGRWn8+5lTdmUcXLvrSbFxukMGX4hHP/r7clz3+64.
Are you sure you want to continue connecting (yes/no)?

這裏輸入「yes」之後回車,會讓你輸入密碼,輸入樹莓派的密碼,預設的是raspberry,之後就出現Linux熟悉的命令列了。

SSH過程中會出現的問題

在樹莓派設定SSH的過程中可能會出現各種各樣的問題,比如連線超時Connection Timeout和拒絕存取Connection refused。

Connection Timeout

出現這個問題可能是在設定的過程中輸錯了什麼地方或者是ssh設定沒有開啓等等,可以先用cmd檔案ping一下對應的ip地址然後看一下能否正常連線,如果能夠正常連線,那就是在Windows terminal的設定過程中出錯,如果無響應,可能是ip地址已經更換或者是ssh沒能成功開啓。

Connection refused

出現這個問題可能是三種情況:

  1. ssh沒有正常執行,可以重複之前的開啓ssh的辦法將他開啓。
  2. 埠22在監聽。
  3. 防火牆不允許port22進行ssh存取,在樹莓派上可以用uwf更改防火牆的設定。

出現上述三種情況在網上有很多的解決的文章可以查閱,直接搜尋之後按照對應的措施去修改基本上都能夠成功解決。

Windows Terminal的美化

完成設定之後可以根據個人喜好對Windows Terminal進行美化,同樣是在JSON檔案下進行修改,我是參考少數派的文章進行修改的,對於不同的環境,設定了不同的背景,來區分各個環境,搞完之後看起來還是蠻漂亮的,這樣偵錯起來心情也好。

結語

最終成功的在Windows Terminal上面執行了RaspberryPi,這個過程中瞭解了SSH協定,學習了一些JSON簡單的語法,花費了一個下午,感覺收穫還是蠻大的。下午一直都ping不到我的ip,找了各種辦法無果快要放棄的時候發現原來只是自己的ip一直都打錯了,真的是太迷糊了,前幾天偵錯Arduino總是把正負極接反,最近可能是熬夜太多了哈哈哈。