如下是學習筆記,學習資源來自
莫煩PYTHON:https://morvanzhou.github.io/tutorials/others/linux-basic/
視頻資源:https://www.bilibili.com/video/av15976434/?p=1
文章目錄
1 Why Linux?
如果你做機器學習什麼的, 很多時候你會發現, 一些模塊, 比如 Tensorflow, Pytorch, 都是 Linux 支持最好. 爲什麼呢? 下面就有介紹啦.
1)免費的
Linux 是一個開放式的系統, 而且最重要的是! 它是免費的!! 免費的!! 免費的!!
正因爲他的免費, 開源, 大量的牛逼程序員涌入了 Linux, 他們在使用 Linux 的同時共同維護和更新着這個系統. 所以 Linux 的精髓就是, 永遠開源 (哈哈, 和我做教程有着異曲同工之處, 這也是我爲什麼開始用 Linux 的原因).
2)比較安全
爲什麼一個開源的系統會更安全? 爲什麼一個大家都能修改的系統會比一個封鎖的系統更安全?
太多人用 Windows 了, 企業, 政府, 銀行等等. 做一個 Windows 的病毒往往比其他的有賺頭多了.
3)老機新用
Linux 的內核文件相對是算少的, 所以整個系統不用佔你多少空間. 我就有這麼一臺大一入學的筆記本, 到現在已經有8年了. 原本 Windows 7 系統, 可是一運行就卡. 我裝上了個 Ubuntu (一種比較流行的 Linux 分支), 電腦瞬間運行”光速”, 上網什麼都不卡了. (很多大學妹子不是覺得上網看劇卡嘛, 給她裝個 Linux, 還顯得你高大上了).
2 安裝 Ubuntu
其實 Linux 不只是 “一個系統”, 他是很多系統的集合, 可以想象成這樣, Linux 就是 Android, 而 Android 還有小米的 米UI, 魅族的UI, 錘子的UI, OPPO 的UI(user interface)等等. 所以實際上要使用的不是 Linux 本身, 而是 Linux 下面的各種 “UI”. 而像 Android 那樣, 他也有很多 “UI”. 比如:
- CentOS
- Debian
- Mint
- Ubuntu
Ubuntu 具體安裝方法請參考 安裝 Ubuntu 17.10
3 Ubuntu 安裝軟件
其實在 Ubuntu 上, 已經有很多安裝好的 app 了. 比如已經有火狐瀏覽器(Firefox), 可替代 Windows Office 的辦公套件 (LibreOffice) 等等. 不過你仍然可以繼續安裝你需要的軟件 app.
1)使用 Ubuntu 自帶的 app 管理器
2)用 Terminal 的方式
sudo apt-get install 你的App名字
4 Linux 基本指令
4.1 cd(change directory)
cd 是 Change Directory 的縮寫,這是用來切換工作目錄的命令。
cd ..
返回上一層的工作目錄cd ../../
向上返回兩次cd -
返回上一次的工作目錄cd ~
返回到 homecd 絕對路徑
去任何地方
4.2 ls(list)
ls = list
ls -l
,輸出詳細信息 -l (long 的簡寫),會打印出文件的權限 (-rw-rw-r-- 之後我們在細說這個), 用戶名, 文件大小, 修改日期, 文件名ls -a
,-a (all 的簡寫) 顯示所有文件 . 這裏還會顯示隱藏的文件 (以 . 開頭的)ls -lh
-lh (human), 直接-l
不方便人看, 這個指令是爲了方便給人觀看的. 注意這裏的文件大小使用了 K, MB, GB 之類概括- 還有很多其他的功能, 我們可以通過
--help
來查看(ls --help
)
4.3 touch 新建文件
touch
能夠新建文件,mkdir
用來新建文件夾
touch file1
建立一個文件touch file1 file2 file3
建立多個文件
4.4 cp(copy)
cp 老文件 新文件
如果新文件已存在,上面指令中老文件會直接覆蓋新文件,爲了避免這種情況,用如下指令cp -i 老文件 新文件
這樣,如果新文件已存在會提示你是否overwrite
新文件,回答yes
、YES
、y
同意覆蓋,回車或其他字母放棄覆蓋cp file1 folder1/
文件複製去文件夾cp -R folder1/ folder2/
複製文件夾,加一個-R
(recursive),表示遞歸的將 folder1 中的所有文件複製到 folder2中cp file* folder2/
複製多個文件. 複製名字部分相同的多個文件, * 是說”你就找文件前面是 file 的文件, 後面是什麼名字無所謂”。後綴相同也行cp *4 folder2/
cp file1copy file2 folder1/
複製多個文件,cp 會默認最後一個選項是要複製去的文件夾
4.5 mv(move)
1)移動去另一個文件夾
mv file1 folder1/
2)重命名文件
因爲移動文件到原始的地點, 但是以不同的文件名. 這種做法不就是在重命名嘛!
mv file1 file1rename
4.6 mkdir,rmdir,rm
1)mkdir (make directory)
mkdir
(make directory) 就是創建一個文件夾的意思, 使用起來很簡單.
mkdir folder
(不帶/也可以),夾中夾mkdir folder/f
mkdir f1 f2 f3
新建多個文件夾
2)rmdir (remove directory)
有一個前提條件. 這些要移除的文件夾必須是空的. 不然會失敗.
rmdir folder
3)rm(remove)
那文件夾裏面有文件的這種情況, 或者是移除單個文件的情況, 我們都能用 rm 來實現.
rm file1
移除單個文件rm -i
有提示地移除文件 (爲了避免誤刪),每個要移除的文件都進行提示rm -I
有提示地移除文件 (爲了避免誤刪),超過3個文件才進行提示rm -r folder
或者rm -R folder
可以在文件夾中有文件的情況下刪除這個文件夾
4.7 cat (catenate)
cat (catenate)
可以用來顯示文件內容, 或者是將某個文件裏的內容寫入到其他文件裏. 我們舉例說明.
1)查看文件內容
我們先新建 1.py 文件,並寫上 print("hello py")
(比如用 vim
),保存好,然後用 cat
進行查看
cat 1.py
output
print("hello py")
2)>
將文件的內容放到另一個文件裏
cat 1.py > 2.py
cat 2.py
output
print("hello py")
3) >
將多個文件的內容打包一起放入另一個文件
cat 1.py 2.py > 3.py
cat 3.py
output
print("hello py")
print("hello py")
4)>>
將內容添加在一個文件末尾
我們先建立一個 4.py
,寫上 this is 4
,然後添加到上面的 3.py
中
cat 4.py >> 3.py
cat 4.py
output
print("hello py")
print("hello py")
this is 4
5 文件權限
圖片來源 https://morvanzhou.github.io/tutorials/others/linux-basic/3-01-file-permissions/
Type
: 很多種 (最常見的是-
爲文件,d
爲文件夾, 其他的還有l
,n
… 這種東西, 真正自己遇到了, 網上再搜就好, 一次性說太多記不住的).User
: 後面跟着的三個空是使用 User 的身份能對這個做什麼處理 (r
能讀;w
能寫;x
能執行 execute;-
不能完成某個操作).Group
: 一個 Group 裏可能有一個或多個 user, 這些權限的樣式和 User 一樣.Others
: 除了 User 和 Group 以外人的權限.
小結:Type、 User、Group、Others(1+3+3+3)
關於 User、Group 和 Others(參考Ubuntu 系統中的用戶與用戶組)
Linux 是個多用戶多任務的分時操作系統,所有想要調用系統資源的用戶都必須先向系統管理員申請一個賬號,然後通過這個賬號進入系統。用戶的賬號一方面能幫助系統管理員對使用系統的用戶進行跟蹤,控制他們對系統資源的訪問;另一方面也能幫助用戶組織文件,爲用戶提供安全性保護。每個賬號都擁有一個唯一的用戶名和用戶密碼。用戶在登錄時鍵入正確的用戶名和密碼後,才能進入系統和自己的主目錄。
用戶與用戶組間的聯繫:
- 一對一:一個用戶可以存在於一個用戶組中,也可以是組中的唯一成員。
- 一對多:一個用戶可以存在於多個用戶組中,那麼此用戶具有多個組的共同權限。
- 多對一:多個用戶可以存在於一個用戶組中,這些用戶具有和組相同的權限。
- 多對多:多個用戶可以存在於多個用戶組中,其實就是上面三個對應關係的擴展。
一般來說, 像一個企業部門的電腦, 都可以放在一個 Group 裏, 分享了一些共享文件和權限. Others 就是除了上面提到的 User 和 Group 以外的人.
用第4節創立的py
文件爲例,ls -l
查看權限
-rw-r--r-- 1 root root 18 Feb 25 08:27 1.py
-rw-r--r-- 1 root root 18 Feb 25 08:30 2.py
-rw-r--r-- 1 root root 47 Feb 25 08:36 3.py
-rw-r--r-- 1 root root 11 Feb 25 08:35 4.py
如何修改這些文件的權限呢?下小節介紹
6 chmod (change mode)修改權限
chmod [誰][怎麼修改] [哪個文件]
1)誰
u
: 對於 User 修改g
: 對於 Group 修改o
: 對於 Others 修改a
: (all) 對於所有人修改
2)怎麼修改
+, -, =
: 作用的形式, 加上, 減掉, 等於某些權限r, w, x
或者多個權限一起, 比如rx
3)哪個文件
- 施加操作的文件, 可以爲多個
看一個例子ls -l
-rw-r--r-- 1 root root 18 Feb 25 08:27 1.py
-rw-r--r-- 1 root root 18 Feb 25 08:30 2.py
-rw-r--r-- 1 root root 47 Feb 25 08:36 3.py
-rw-r--r-- 1 root root 11 Feb 25 08:35 4.py
chmod u-rw 1.py 2.py 3.py
修改權限,然後再查看 ls -l
----r--r-- 1 root root 18 Feb 25 08:27 1.py
----r--r-- 1 root root 18 Feb 25 08:30 2.py
----r--r-- 1 root root 47 Feb 25 08:36 3.py
-rw-r--r-- 1 root root 11 Feb 25 08:35 4.py
下面來一個有趣的 demo
我不怎麼用權限這東西, 但是我卻發現給 python 文件添加權限 x
還算有用的. 爲什麼這麼說? 因爲通常, 如果一個 .py
沒有 x
權限, 在 terminal 中你就需要這樣執行:
python3 1.py
output
hello py
如果你有了 x
(可執行權限), 你運行這個文件可以直接這樣打(通過 chmod u+x 1.py
來添加權限):
./1.py
但是需要在 1.py
前添加一句話
#!/usr/bin/python3 # 這句話是爲了告訴你的電腦執行這個文件的時候用什麼來加載
不同人的 python 可能不一樣,用以下命令查看 python 的路徑(參考)
whereis python
查看所有python的路徑,不止一個which python
查看當前使用的python路徑
把 /usr/bin/python3
替換成你對應的當前 python 路徑即可。
然後就可以通過 ./1.py
來執行代碼了,結果如下
hello py
7 Linux 通過 SSH 遠程 Linux
1)給 Linux 安裝 OpenSSH
爲了實現 SSH 功能, 你得確定你的 Linux 上有安裝了 SSH 服務, 通常可能是沒有安裝的. 所以我們將要安裝一個開源的 SSH 工具, 叫做 OpenSSH, 將你的 Linux 變成一個服務器 (就是像你訪問網站一樣訪問你的 Linux). 在 Linux 上打開你的 Terminal, 然後輸入下面這句話安裝 openssh-server. sudo 是使用管理員權限的意思, 所以回車後它可能要求你輸入你用戶密碼.
sudo apt-get install openssh-server
2)Linux SSH 去 Linux
ssh [要控制的用戶名]@[它的IP地址]
eg ssh [email protected]
如果連接服務器映射了端口號,則是 ssh -p [端口號] [要控制的用戶名]@[它的IP地址]
eg ssh -p 44020 [email protected]
確保你操控和被操控的兩臺電腦連接上了同一個路由器. 然後在你被操控電腦的 terminal 上輸入這個獲取被操控電腦的 ip 號碼. ifconfig
如果它提示你沒有安裝 ifconfig
, 你就按它的要求安裝就好. 輸入下面指令就能安裝. sudo apt install net-tools
安裝好了後,在終端輸入ifconfig
,找到以 inet
開頭的字樣, 這就是你在這個路由下的 ip 地址了.
8 Window 通過 SSH 遠程 Linux
8.1 Xshell
連 Ubuntu Server 用 xshell
軟件比較方便的,因爲圖形頁面。
鏈接:https://pan.baidu.com/s/1ue4YGCgQnYao2VCrmN2hQQ
提取碼:syqd
下載完成後,新建會話屬性,在類別中選中連接
- 名稱:隨便填
- 主機:就是需要連接的服務器的 ip
- 端口號:端口映射號
然後選擇類別中的 用戶身份驗證
- 用戶名:linux 系統中的用戶名
- 密碼:用戶名密碼
填好之後連接成功會出現如下界面,就可以在 windows 上遠程控制 Linux 系統了。
文件傳輸,用如下箭頭所示的地方!
8.2 TeamViewer
這個適合連接 Ubuntu 系統(有圖形頁面的),去官網下載一下就行,在 windows 和 Ubuntu 系統中下相應的版本,然後通過夥伴的 ID
和 密碼
連接!同樣手機也可以通過這個方法連接到自己的電腦(也有許多 SSH軟件可以通過手機連接到自己的電腦,在 app store 搜索 SSH 即可)!
9 雲端運行
在自己的筆記本上(Linux 或者 window系統)下寫好的程序運行起來太佔內存,影響做其它的事情,想丟去空閒的 Linux(下面簡稱 Linux2) 系統上運行,怎麼破?
9.1 Linux 寫好的代碼在 Linux2 上運行(局域網)
eg 如下 python 代碼,命名爲 1.py
import platform
a = 0
for i in range(9999):
a += i
print("Finish job, result=%i" % a)
print("This is", platform.system())
現在本地的 Linux 系統上運行,
在終端輸入 python 1.py
結果如下
Finish job, result=49985001
This is Linux
再用空閒的 Linux 系統上運行,採用如下形式
ssh 用戶名@Linux2的ip python < 要執行的代碼在Linux中的路徑
或者
ssh -p 端口號 用戶名@Linux2的ip python < 要執行的代碼在Linux中的路徑
具體一點
ssh -p 43000 ym@202.197.66.62 python < /root/userfolder/1.py
output
Finish job, result=49985001
This is Linux
這樣寫就不會連接上 Linux2 了,只會讓 Linux 程序在 Linux2 上運行!打工告成
9.2 Window 寫好的代碼在 Linux 上運行(局域網)
打開 cmd,cd 到程序目錄,輸入 python 1.py
,結果如下
Finish job, result=49985001
This is Windows
我用的是 windows 10 系統,有自帶的 ssh 功能(設置->管理可選功能),安裝 OpenSSH 客戶端
和 OpenSSH 服務器
此時在 cmd 中輸入 ssh,就可以拉
在 cmd 中,我可以成功的連接到我的 Linux
但無法把在 Linux 上運行的程序結果返回在 cmd 窗口中,很遺憾!我後來借用了 git 工具(成功把windows的程序在 linux 下運行了),git 可以自己去下載安裝!!!
10 文件傳輸
如果是有很多的 Python 文件怎麼辦呢? 有時候 Python 文件是一環扣一環, 這個文件裏調用了那個文件的東西. 這時我們就能先全部複製所有必須文件去 Linux 的緩存區 或者 桌面, 然後再使用 ssh 在 Linux 雲端的運行傳送過去的文件.
10.1 window to Linux
a.py
需要調用 b.py
# This is a.py
from b import inner_func
inner_func()
b.py
# This is b.py
def inner_func():
print("This is a function in b")
把 windows 中的 a.py
和 b.py
同時傳入服務器的 /root/userfolder/
目錄下,我在 windows 的 git 下輸入如下指令
scp -r -P 44020 {a,b}.py root@202.197.66.62:/root/userfolder/
scp -r -P 端口號 源文件 Linux用戶名@Linux的ip地址:目標文件夾
如果設計到 permission 的問題,請參考 linux下scp報Permission denied錯誤的解決
執行的話, 和上面的步驟有點不一樣, 在本地用 ssh 去雲端, 但是 ssh 的時候同時發送一條指令去執行 a.py
. 這條指令我們用 ""
給框起來, 說明是要發送去雲端再執行的指令.
ssh -p 44020 root@202.197.66.62 "python /root/userfolder/a.py"
10.2 Linux to Linux
基本同 window to Linux,改下路徑即可,這裏不再贅述
11 自己的雲計算, 多電腦共享你雲端文件
比如要自己的 window 和 Linux 文件共享,最好兩個都有圖形頁面!!!
參考 https://morvanzhou.github.io/tutorials/others/linux-basic/5-02-share-folder/