Windows 远程连接 Linux 环境

我的 PC 是 Windows 11 操作系统,而我购置的服务器安装的是 Linux 环境(CentOS),如需用 PC 操作服务器,则需要建立 PC 和远程服务器的远程连接。

我这里使用到的工具是 Windows 自带的 Powershell,Win+R 输入 powershell 即可打开。

这里顺便推荐一波 Windows Terminal 作为默认终端程序打开 Powershell,非常美观!而且有很多配置可调。

Powershell - Windows Terminal

Powershell 自带支持 ssh 命令。直接输入 ssh {user}@{ip} 即可建立连接。

ssh 连接

最后一行 [] 内显示 {用户名}@{主机名} {目录} 时,说明已经进入 Linux 终端。


目录操作

登录系统后输入 ls / 后即可查看/,即根目录下所有目录和文件。

1
2
[I have no name!@i-ym8u2kyp ~]$ ls /
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

各个目录的功能可参见 Linux 系统目录结构 | 菜鸟教程 (runoob.com)

Linux 系统的文件路径有 绝对路径相对路径 两种写法:

  • 绝对路径 由根目录(/)写起,如 /usr/share/dic
  • 相对路径 由当前路径写起。在 Linux 文件系统中,. 代表当前目录(也可用 ./ 表示),.. 代表上一层目录(也可用 ../ 表示)。如我们的当前目录绝对路径为 /usr/share/doc ,在当前目录用相对路径方式表示 /usr/share/man 的方法是 ../man

另外需要注意,如果一个目录或文件名以 . 开始,如 .bashrc,说明该目录 / 文件为隐藏目录 / 文件,默认状态下不显示。

处理目录的常见命令

常见命令有:lscdpwdmkdirrmdircprmmv。可以通过 man [命令] 的方式来查看命令的使用文档。

ls

列出目录及文件名(list files)

常用参数:

  • -a:连同隐藏文件一起展示所有文件
  • -d:仅列出目录本身,而不是列出目录内的文件数据
  • -l:长数据串列出详情

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[I have no name!@i-ym8u2kyp ~]$ ls -l / # 展示详情
total 16
lrwxrwxrwx. 1 0 root 7 Oct 30 2020 bin -> usr/bin
dr-xr-xr-x. 5 0 root 4096 Oct 30 2020 boot
drwxr-xr-x 19 0 root 2820 Dec 1 16:41 dev
drwxr-xr-x. 78 0 root 8192 Dec 11 17:41 etc
drwxr-xr-x. 3 0 root 23 Dec 1 16:38 home
lrwxrwxrwx. 1 0 root 7 Oct 30 2020 lib -> usr/lib
lrwxrwxrwx. 1 0 root 9 Oct 30 2020 lib64 -> usr/lib64
drwxr-xr-x. 2 0 root 6 Apr 11 2018 media
drwxr-xr-x. 2 0 root 6 Apr 11 2018 mnt
drwxr-xr-x. 2 0 root 6 Apr 11 2018 opt
dr-xr-xr-x 116 0 root 0 Dec 1 16:41 proc
dr-xr-x---. 4 0 root 161 Dec 1 16:51 root
drwxr-xr-x 21 0 root 660 Dec 11 17:41 run
lrwxrwxrwx. 1 0 root 8 Oct 30 2020 sbin -> usr/sbin
drwxr-xr-x. 2 0 root 6 Apr 11 2018 srv
dr-xr-xr-x 13 0 root 0 Dec 8 11:36 sys
drwxrwxrwt. 8 0 root 172 Dec 13 03:40 tmp
drwxr-xr-x. 13 0 root 155 Oct 30 2020 usr
drwxr-xr-x. 19 0 root 267 Feb 5 2021 var
1
2
[I have no name!@i-ym8u2kyp ~]$ ls -dl / # 展示当前目录详情
dr-xr-xr-x. 17 0 root 244 May 31 2021 /

cd

cd [目录]

切换目录(change directory)

如:

1
2
3
[I have no name!@i-ym8u2kyp ~]$ cd /dev # 切换到指定绝对路径
[I have no name!@i-ym8u2kyp dev]$ cd ../media # 切换到指定相对路径
[I have no name!@i-ym8u2kyp media]$

pwd

显示当前所在的目录(print working directory)

常用参数

  • -P:显示确实路径,而非连结路径

mkdir

mkdir [目录名/路径]

创建新目录(make directory)

常用参数

  • -m:配置文件权限,忽略默认权限配置影响
  • -p:可递归创建多级目录

如:

1
2
3
4
5
[I have no name!@i-ym8u2kyp ~]$ cd /tmp
[I have no name!@i-ym8u2kyp tmp]$ mkdir test5
[I have no name!@i-ym8u2kyp tmp]$ mkdir test6/test7/test8 # 默认创建多级目录会报错
mkdir: cannot create directory ‘test6/test7/test8’: No such file or directory
[I have no name!@i-ym8u2kyp tmp]$ mkdir -p test6/test7/test8
1
2
3
4
5
6
[I have no name!@i-ym8u2kyp tmp]$ mkdir -m 711 test7 # 创建目录并配置权限
[I have no name!@i-ym8u2kyp tmp]$ ls -l
total 0
drwxr-xr-x 2 1000 datawhale 6 Dec 15 16:22 test5
drwxr-xr-x 3 1000 datawhale 19 Dec 15 16:23 test6
drwx--x--x 2 1000 datawhale 6 Dec 15 16:25 test7 # 新创建目录配置权限与默认(755)不同

关于文件权限,可以查看 Linux 文件基本属性 | 菜鸟教程 (runoob.com)

文件权限表示

rmdir

rmdir [目录名/路径]

删除空目录(remove directory)

常用参数

  • -p:可递归删除多级目录

如:

1
2
3
4
5
6
[I have no name!@i-ym8u2kyp tmp]$ rmdir test5
[I have no name!@i-ym8u2kyp tmp]$ rmdir test6
rmdir: failed to remove ‘test6’: Directory not empty
[I have no name!@i-ym8u2kyp tmp]$ rmdir -p test6
rmdir: failed to remove ‘test6’: Directory not empty
[I have no name!@i-ym8u2kyp tmp]$ rmdir -p test6/test7/test8 # 删除多级目录,目录须为空

如果要删除非空目录,可参见后续的 rm 命令

cp

cp [源路径] [目标路径]

复制文件或目录(copy)

常用参数:

  • -i:若目标路径存在,覆盖前先询问动作
  • -p:复制时联通属性复制
  • -r:递归复制目录
1
2
3
4
5
6
[I have no name!@i-ym8u2kyp tmp]$ mkdir test7
[I have no name!@i-ym8u2kyp tmp]$ mkdir test9
[I have no name!@i-ym8u2kyp tmp]$ mkdir test7/test8
[I have no name!@i-ym8u2kyp tmp]$ cp test9 test7/test8 # 直接复制目录会失败
cp: omitting directory ‘test9’
[I have no name!@i-ym8u2kyp tmp]$ cp -r test9 test7/test8
1
2
3
[root@www ~]# cp ~/.bashrc /tmp/bashrc
[root@www ~]# cp -i ~/.bashrc /tmp/bashrc #n不覆盖,y为覆盖
cp: overwrite `/tmp/bashrc'? n

rm

rm [文件/目录路径]

移除文件或目录(remove)

常用参数:

  • -f:强制执行(force),忽略不存在的文件
  • -i:互动模式(interactive),询问是否执行
  • -r:递归删除,删除目录及子目录
1
2
[I have no name!@i-ym8u2kyp tmp]$ rm -ri test7/test8/test9
rm: remove directory ‘test7/test8/test9’? y

mv

mv [源路径] [目标路径]

移动文件或目录,或修改名称(remove)

常用参数:

  • -f:强制执行,如果目标文件已存在,不会询问而直接覆盖
  • -i:若目标已存在,询问是否直接覆盖

如:

1
2
[I have no name!@i-ym8u2kyp tmp]$ mv test9 test7/test8/test9
[I have no name!@i-ym8u2kyp tmp]$ mv test7 test10 # 重命名

实战:在目录下创建文件夹、删除文件夹

  1. /home/datawhale 目录下,新建一个以英文昵称为名的文件夹 A
  2. 在文件夹 A 内部创建一个以 datawhale 命名的文件夹 B
  3. 在 B 文件夹内创建一个空的 txt 文件
  4. 删除上一步创建的文件
  5. 删除文件夹 B,然后删除文件夹 A
1
2
3
4
5
6
7
8
9
10
[I have no name!@i-ym8u2kyp ~]$ cd /home/datawhale
[I have no name!@i-ym8u2kyp ~]$ mkdir MarioZZJ # [1] 创建文件夹
[I have no name!@i-ym8u2kyp ~]$ cd MarioZZJ
[I have no name!@i-ym8u2kyp MarioZZJ]$ mkdir datawhale # [2] 创建文件夹
[I have no name!@i-ym8u2kyp MarioZZJ]$ cd datawhale
[I have no name!@i-ym8u2kyp datawhale]$ touch empty.txt # [3] 创建文件
[I have no name!@i-ym8u2kyp datawhale]$ rm empty.txt # [4] 删除文件
[I have no name!@i-ym8u2kyp datawhale]$ cd ../../
[I have no name!@i-ym8u2kyp ~]$ rm -r ./MarioZZJ/datawhale # [5] 删除非空文件夹
[I have no name!@i-ym8u2kyp ~]$ rmdir ./MarioZZJ # [5] 删除空目录

文件操作

wget

wget [目标文件URL]

下载文件的命令很多,如 wgetapt-get 等,这里以 wget 为例。我租赁的服务器安装的是 CentOS 系统,未预装 wget,使用该命令可能会提示 command not found。可以使用 yum 先安装 wget

1
yum -y install wget

常用参数:

  • -O [name]:将下载的文件重命名
  • -c:断点续传(重新启动下载中断的文件)
  • -b:后台下载

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[I have no name!@i-ym8u2kyp tmp]$ wget -O douban.png  https://img3.doubanio.com/f/frodo/144e6fb7d96701944e7dbb1a9bad51bdb1debe29/ # 下载并重命名
pics/app/logo.png
--2021-12-15 18:04:46-- https://img3.doubanio.com/f/frodo/144e6fb7d96701944e7dbb1a9bad51bdb1debe29/pics/app/logo.png
Resolving img3.doubanio.com (img3.doubanio.com)... 60.28.216.240, 60.28.216.242, 60.28.216.244, ...
Connecting to img3.doubanio.com (img3.doubanio.com)|60.28.216.240|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 24158 (24K) [image/png]
Saving to: ‘douban.png’

100%[======================================================================================>] 24,158 --.-K/s in 0s

2021-12-15 18:04:46 (212 MB/s) - ‘douban.png’ saved [24158/24158]

[I have no name!@i-ym8u2kyp tmp]$ wget -b -O douban.png https://img3.doubanio.com/f/frodo/144e6fb7d96701944e7dbb1a9bad51bdb1debe29/pics/app/logo.png # 下载重命名,不显示下载过程
Continuing in background, pid 17703.
Output will be written to ‘wget-log’.
[I have no name!@i-ym8u2kyp tmp]$

cat

cat [文件路径]

从第一行开始显示文件内容(将文件连接到屏幕上,concatenate)

常用参数:

  • -b:列出非空白行行号
  • -n:列出所有行行号
  • -v:列出一些看不出来的特殊字符
  • -E:将结尾的断行字节显示出来
  • -T:将 [tab]^l 展示出来
  • -A:等同于 -vET

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[I have no name!@i-ym8u2kyp ~]$ cat -b /etc/my.cnf
1 [mysqld]
2 datadir=/var/lib/mysql
3 socket=/var/lib/mysql/mysql.sock
4 # Disabling symbolic-links is recommended to prevent assorted security risks
5 symbolic-links=0
6 # Settings user and group are ignored when systemd is used.
7 # If you need to run mysqld under a different user or group,
8 # customize your systemd unit file for mariadb according to the
9 # instructions in http://fedoraproject.org/wiki/Systemd

10 [mysqld_safe]
11 log-error=/var/log/mariadb/mariadb.log
12 pid-file=/var/run/mariadb/mariadb.pid

13 #
14 # include all files from the config directory
15 #
16 !includedir /etc/my.cnf.d

[I have no name!@i-ym8u2kyp ~]$

tac

从最后一行开始显示(正好是 cat 反过来)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[I have no name!@i-ym8u2kyp ~]$ tac /etc/my.cnf

!includedir /etc/my.cnf.d
#
# include all files from the config directory
#

pid-file=/var/run/mariadb/mariadb.pid
log-error=/var/log/mariadb/mariadb.log
[mysqld_safe]

# instructions in http://fedoraproject.org/wiki/Systemd
# customize your systemd unit file for mariadb according to the
# If you need to run mysqld under a different user or group,
# Settings user and group are ignored when systemd is used.
symbolic-links=0
# Disabling symbolic-links is recommended to prevent assorted security risks
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
[mysqld]
[I have no name!@i-ym8u2kyp ~]$

head [文件路径]

取出文件前几行(默认 10 行)

常用参数:

  • -n [行数]:指定显示的行数

如:

1
2
3
4
5
6
7
[I have no name!@i-ym8u2kyp ~]$ head -n 5 /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[I have no name!@i-ym8u2kyp ~]$

tail

head 相反,取出文件后几行。

实战2:在目录下下载文件、阅读文件

  1. /home/datawhale 目录下,新建一个以英文昵称命名的文件夹 A
  2. 在文件夹 A 内创建一个以 datawhale 命名的文件夹 B
  3. 使用 wget 命令下载 https://mirror.coggle.club/dataset/affairs.txt,到文件夹 B
  4. 使用 catheadtail 命令阅读下载的文件
  5. 在命令行使用 ipython 进入 Python3 环境,并使用 pandas 读取下载的文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
[I have no name!@i-ym8u2kyp ~]$ mkdir -p ./MarioZZJ/datawhale # [1,2] 创建文件夹
[I have no name!@i-ym8u2kyp ~]$ cd ./MarioZZJ/datawhale
[I have no name!@i-ym8u2kyp datawhale]$ wget https://mirror.coggle.club/dataset/affairs.txt # [3] 下载文件到当前目录
--2021-12-15 20:24:41-- https://mirror.coggle.club/dataset/affairs.txt
Resolving mirror.coggle.club (mirror.coggle.club)... 60.221.23.1, 2408:8731:c001:2:3::3fb
Connecting to mirror.coggle.club (mirror.coggle.club)|60.221.23.1|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 92161 (90K) [text/plain]
Saving to: ‘affairs.txt’

100%[=======================================================================================>] 92,161 --.-K/s in 0.02s

2021-12-15 20:24:42 (3.88 MB/s) - ‘affairs.txt’ saved [92161/92161]

[I have no name!@i-ym8u2kyp datawhale]$ cat ./affairs.txt
rate_marriage,age,yrs_married,children,religious,affairs
5,32,6,1,3,0
4,22,2.5,0,2,0
3,32,9,3,3,1
3,27,13,3,1,1
....... # [4] 使用 cat 阅读文件,文件整体很长,后续输出略去
[I have no name!@i-ym8u2kyp datawhale]$ head -n 5 ./affairs.txt # [4] 使用 head 阅读文件前 5 行
rate_marriage,age,yrs_married,children,religious,affairs
5,32,6,1,3,0
4,22,2.5,0,2,0
3,32,9,3,3,1
3,27,13,3,1,1
[I have no name!@i-ym8u2kyp datawhale]$ tail -n 5 ./affairs.txt # [4] 使用 tail 阅读文件后 5 行
4,22,2.5,0,3,0
5,22,2.5,0,2,0
5,32,13,2,3,0
4,32,13,1,1,0
5,22,2.5,0,2,0[I have no name!@i-ym8u2kyp datawhale]$


[I have no name!@i-ym8u2kyp datawhale]$ ipython # [5] 使用 ipython 打开交互式 python3
Python 3.6.8 (default, Nov 16 2020, 16:55:22)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.16.2 -- An enhanced Interactive Python. Type '?' for help.

In [1]: !pwd ## 使用超级命令查看当前工作目录
/home/datawhale/MarioZZJ/datawhale

In [2]: import pandas as pd

In [3]: data = pd.read_csv('./affairs.txt') ## 因为之前看过文件,确定是 csv,使用该方法读取

In [4]: data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6366 entries, 0 to 6365
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 rate_marriage 6366 non-null int64
1 age 6366 non-null float64
2 yrs_married 6366 non-null float64
3 children 6366 non-null float64
4 religious 6366 non-null int64
5 affairs 6366 non-null int64
dtypes: float64(3), int64(3)
memory usage: 298.5 KB

In [5]: data.head(5)
Out[5]:
rate_marriage age yrs_married children religious affairs
0 5 32.0 6.0 1.0 3 0
1 4 22.0 2.5 0.0 2 0
2 3 32.0 9.0 3.0 3 1
3 3 27.0 13.0 3.0 1 1
4 4 22.0 2.5 0.0 1 1

In [6]: exit()
[I have no name!@i-ym8u2kyp datawhale]$

文件编辑:Vim

nano

nano 是 Linux 的一个基础编辑器,使用 nano [文件路径] 即可使用 nano 打开文件

Nano 界面

第一行反色部分指示 nano 版本和文件路径,随后下方显示出文件内容,我们在终端使用键盘上的方向键可以移动光标查看文件内容。在屏幕最底端展示的是快捷键,使用快捷键即可实现上述操作。以 Windows 操作的终端为例:

  • ^ 后接按键,代表该操作可以用 Ctrl + [按键] 的方式触发。例如要退出编辑器,可以按 Ctrl+X;以及屏幕上提示的其他操作
  • M- 后接按键,代表该操作可以用 Alt + [按键] 的方式触发。例如
    • Alt + M:打开/关闭支持鼠标移动光标
    • Alt + R:查找模式下输入正则表达式

vim

vim 是知名的 Linux 内置文本编辑器,功能较为丰富,在程序员中被广泛使用。详细教程可参考 Linux vi/vim | 菜鸟教程

Vim 键盘图

vim 分为三种模式,分别是命令模式(command mode)、输入模式(insert mode)和底线命令模式(last line mode)

Vim 工作模式切换

命令模式

使用命令 vim [文件路径] 即可使用 vim 编辑器打开文件。

默认进入的是命令模式,该模式下敲击键盘会被视作命令而非输入字符。命令模式支持的命令较少,使用更多命令可以按 : 进入底线命令模式。而如需输入则可以按 i 进入输入模式。

Vim 命令模式

一般模式支持很多按键功能,介绍几个常用的:

  • hjkl:作用与 相同,可移动光标。
  • [行数]+h/j/k/l/←/↓/↑/→:组合快速移动任意行/字符数
  • Ctrl + F/B:(forward/backward)相当于 Page Up / Page Down

输入模式

命令模式下,按 i 进入输入模式:

Vim 输入模式

在输入模式下部分按键的功能如下:

  • 字符按键,及其与 Shift 按键的组合:输入字符
  • 回车 [Enter]:换行
  • 退格 [Backspace]:删除光标前一个字符
  • 删除 [Del]:删除光标后一个字符
  • Insert:切换光标未输入/替换模式。光标分别为竖线/下划线。
  • Page Up/Down:上下翻页
  • HOME/END:移动光标到行首/行尾
  • ESC:退出输入模式,切换到命令模式

底层命令模式

命令模式下,按 : 进入底层命令模式:

Vim 底层命令模式

在底线命令模式中,基本的命令有:

  • q:退出程序
  • w:保存文件
  • q!:强制离开而不保存
  • w [文件名]:将编辑的数据存储为另一个档案
  • r [文件名]:在编辑的数据中,将另一个文件的数据追加到游标后面
  • ! [终端指令]:暂时离开 vim,在指令中执行指令,并打印结果
  • set nu/set nonu:显示/取消行号

实战4:在目录下使用 vi 或 vim 编辑文件

  1. 使用 Nano 和 Vim 分别创建 .py 文件,并输入以下内容,并运行

    1
    2
    #!/usr/bin/env python3
    print('Hello World!')

实操:

Nano 操作过程

Vim 操作过程