{%hackmd DfWYF9cYREebVNN1eEOz-w %} ubuntu ====== > ***不知自己不知道, 那你會以為你知道.*** ###### tags: `ubuntu` `cmd` `202204` ## 檔案系統 - 使用 ls -l, 呈現出的資訊個欄位意義 [欄位對應的意思](https://ubuntuqa.com/zh-tw/article/6493.html) ## .so .a [ref](https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z000000P8svSAC&l=zh-TW) - .a 是 static libraries: 包含了在編譯時連接到底層程式中的相關函數,並成為應用程式的一部分。舉例來說 NI-488.2 驅動程式就是使用 static libraries - .so 是dynamically linked shared object libraries - 簡稱: shared objects、shared libraries、shared object libraries - 執行時動態載入,Shared object libraries 不是應用程式的一部分,但它們在編譯過程中必須可用取用。類似於Windows電腦上的DLL檔。 舉例來說 NI-VISA 驅動程式就是使用 Shared object libraries ## 快捷鍵 - clear terminal: ctrl + L - reset terminal: ctrl + shift + K ## 檔案位置相關 - 下載的軟體的存放位置: /var/cache/apt/archives - 安裝後軟體的預設位置: /usr/share - 可執行檔案位置: /usr/bin - 配置檔案位置: /etc - lib檔案位置: /usr/lib ## cmd ### apt-get vs apt 兩者皆是管理套件的工具,apt 相較於 apt-get 新。聽說是各廠家在力推的,而且指令也比較短。如果剛開始接觸的人可以考慮使用 apt 來管理套件。 - [Linux apt 和 apt-get 之間的差別](https://clay-atlas.com/blog/2021/12/03/linux-apt-get-difference/) - [ubuntu manuals](https://blog.gtwang.org/linux/linux-ls-command-tutorial/) ### Ctrl + R 可以搜尋過往的指令 ### 快速找到相關的檔案或路徑: $ whereis [traget name] ### 基本指令 ```bash # view cpu detail $ lscpu # 查詢作業系統相關資訊 $ uname -a # 查詢指令方法 $ man [cmd] # rem 變為 root 權限 $ sudo su - # logout sudo model and go back your account. $ exit # 查詢 ipv4 $ ip -4 addr # 查詢各網卡資訊 $ ifconfig # 顯示網路路由表 # `-t`參數可以只顯示TCP連線。 # `-n`參數可以讓IP可以直接被輸出,而不需透過DNS反查其對應的網域名稱。 # `-p`參數可以顯示佔用連線的行程。 $ sudo netstat -tlnp # 當前路徑資訊 $ pwd # 直接執行 ls 帶任何參數的話,會列出目前目錄中的檔案與目錄列表 $ ls # 檔案詳細資訊 $ ls -l # 參數可以顯示隱藏的檔案與目錄 $ ls -a # To ping a port using telnet, enter the following command in the terminal $ telnet <address> <port_number> # 新增目錄 $ mkdir [path name] # create one or mutiple file $ touch [file mame & extension], [file mame & extension] # 回到 Home/user $ cd # remove file or mutiple file $ rm [file name], [file name] # remove dict $ rmdir [path name] # copy file # `[target file full path]` 要複製目標檔案的完整路徑 # `[destination]` 複製到哪? $ cp [target file full path] [destination] ``` ### 搜尋的 regular expression: grep | awk ref: [Linux 匹配文字 grep 指令用法教學與範例](https://blog.gtwang.org/linux/linux-grep-command-tutorial-examples/) 有時候在搜尋路徑、清單,或是已經安裝過的套件,只想抓取包含特定字串的內容。就可以透過 grep | awk ```bash # 在 /etc/os-release 檔案中搜尋 Ubuntu 關鍵字 $ grep Ubuntu /etc/os-release # 不分大小寫 $ grep -i Ubuntu /etc/os-release # 亦可搭配萬用字元(`*`)同時搜尋多個檔案,例如在 `/etc/` 目錄之下所有 `*.conf` 檔案中,尋找 `network` 這個字眼: $ grep network /etc/*.conf # a 開頭 $ ls | grep "^a" # b 結尾 $ ls | grep "b$" # a 或 b 開頭 $ ls | grep "^[ab]" # a 或 b 結尾 $ ls | grep "[ab]$" # 針對欄位來過濾 $ dpkg --list | awk '$1=="ii" && $4=="amd64"' ``` ## apt 管理 - [如何移除 package](https://askubuntu.com/questions/151941/how-can-you-completely-remove-a-package) - [Day 7 - 啊我就怕 Nvidia 顯卡驅動裝不起來啊](https://ithelp.ithome.com.tw/m/articles/10267678) ```bash # 列出待更新的清單 $ apt list --upgradable # 第一次安裝 ubuntu,可先更新和升級套件 $ sudo apt update $ sudo apt upgrade # 清除更新時所下載回來的更新(安裝)檔案 $ sudo apt clean # list package and use grep # regular expression: ex => php, ^php $ dpkg --list | grep -i [regular expression] # step1- remove package $ sudo apt remove [package name] # step2- 使用 autoremove 可以先確認移除的 dependence 有哪些,網上有些人說會移除不該移除的? $ sudo apt -s autoremove $ sudo apt -s --purge autoremove [package name] # step3- remove package and dependence (delete their systemwide configuration files too) $ sudo apt --purge autoremove [package name] ``` ## 服務是否啟動 [WSL 中無法使用 systemctl 的指令來確認](https://www.cnblogs.com/a5idc/p/13752839.html) - 對應 ![Imgur](https://i.imgur.com/bH2Zzu3.png) ## vim editor - [Vim 指令一覽](https://code.yidas.com/linux-vi-vim-command/) ``` bash $ vim [filename] # 進入編輯器後 # i: 在游標對應的位置, 進入插入模式 # o: 當前的游標位置向下新增一行, 進入插入模式 # 存檔, 強制存檔後面加驚嘆號 ! $ :w # 離開 $ :q # 強制離開 $ :q! # 遇到 readonly, 用 sudo 遭做, 第一次惠要求輸入密碼 $ :w !sudo tee % # 向下搜尋字串, 向上搜尋開頭換成 ? $ /[search target] # 顯示行號 :set number # 向下搜尋字串不分大小寫, 向上搜尋開頭換成 ? $ /\c [search target] # 繼續搜尋下一個結果 n, 繼續搜尋上一個結果 N ``` ## Nginx on Ubuntu - [參考](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04) - [[WebServer 基礎概念系列]]、[[Nginx基礎概念]] ```bash # 安裝 nginx $ sudo apt install nginx # 重新啟動 step1- 停止 Server (觀察是都沒有啟動,所以直接啟動 nginx: sudo service nginx start) $ service nginx status $ sudo nginx -t # step2- 使用以下指令時,需搭配 sudo su -,否則會有權限問題 $ nginx -c /etc/nginx/nginx.conf # step3- 重新載入設定黨並啟動 $ sudo nginx -s reload # step4- 確認是否啟動成功,看是否監聽 ipv4/ipv6 的 80 port $ sudo netstat -tlnp | grep nginx ``` ## PHP on Ubuntu - [[PHP基礎概念]] ref: - [# How To Install PHP 7.4 on Ubuntu 20.04/18.04/16.04](https://computingforgeeks.com/how-to-install-php-on-ubuntu/) - [# Unable to self-update Composer](https://stackoverflow.com/questions/37772798/unable-to-self-update-composer) - [# Download Composer Latest: v2.3.10](https://getcomposer.org/download/) - [# Downloading the Composer Executable](https://getcomposer.org/doc/00-intro.md#downloading-the-composer-executable) - [# Ubuntu Server Installing PHP 7 WITHOUT Apache](https://stackoverflow.com/questions/34880267/ubuntu-server-installing-php-7-without-apache) 不同 ubuntu 版本安裝上有差異,以下示範 18.04 > 後來發現安裝 php7.4 會把 apache2 給裝起來,可能去影響 nignx 底下的 config。 >> 解決方案: 不直接裝整包的 PHP,改裝 fpm + cli 即可。 ```bash # ubuntu 18.04 下載的版本是 php 7.2, 為了要使用 laravel 8, 需升級到 7.4 # Step 1: Add PHP PPA Repository $ sudo apt update $ sudo apt -y install software-properties-common $ sudo add-apt-repository ppa:ondrej/php $ sudo apt update $ sudo apt upgrade # Step 2: Install PHP 7.4 FPM And additional packages, -y 是不再詢問是否安裝 $ sudo apt install php7.4-fpm -y $ sudo apt install php7.4-cli -y # 等同於 sudo apt install -y php7.4-bcmath, php7.4-bz2, php7.4-XXX... $ sudo apt install -y php7.4-{bcmath,bz2,intl,gd,mbstring,zip,common,curl,xml,pdo} # pear 不需要安裝於 Linux $ sudo apt install -y php7.4-pear # step 3: 啟動 FPM,記得要檢查 Apache 服務是否關閉(無安裝可不用檢查) $ service apache2 status $ whereis apache $ dpkg --list | grep -i apache $ sudo service php7.4-fpm start $ service php7.4-fpm status # step 4: 安裝 composer 來管理 php 套件 $ sudo apt install unzip # 在當前目錄將 installer 下載回來: composer-setup.php $ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" # 驗證 SHA 從官網上載回並儲存, 用 echo $HASH $ HASH="$(wget -q -O - https://composer.github.io/installer.sig)" $ php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" # If the hashes match, you will see the following output: # cmd output: Installer verified # 下載最新版的 composer $ sudo php composer-setup.php $ php -r "unlink('composer-setup.php');" # `composer.phar` into a directory on your PATH, so you can simply call `composer` from any directory $ sudo mv composer.phar /usr/bin/composer ```