forkdog

记录学习的地方

0%

关机/重启

序号 命令 对应英文 作用
01 shutdown 选项 时间 shutdown 关机/重新启动

shutdown

shutdown 命令可以 安全 关闭 或者 重新启动系统

选项 含义
-r 重新启动
  • 不指定选项和参数,默认表示 1 分钟之后 关闭电脑
  • 远程维护服务器时,最好不要关闭系统,而应该重新启动系统

常用命令示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重新启动操作系统,其中 now 表示现在
$ shutdown -r now

# 立刻关机,其中 now 表示现在
$ shutdown now

# 系统在今天的 20:25 会关机
$ shutdown 20:25

# 系统再过十分钟后自动关机
$ shutdown +10

# 取消之前指定的关机计划
$ shutdown -c

查看或配置网卡信息

序号 命令 对应英文 作用
01 ifconfig configure a network interface 查看/配置计算机当前的网卡配置信息
02 ping ip地址 ping 检测到目标 ip地址 的连接是否正常

网卡 和 IP 地址

网卡
  • 网卡是一个专门负责网络通讯的硬件设备
  • IP 地址是设置在网卡上的地址信息

我们可以把 电脑 比作 电话网卡 相当于 SIM 卡IP 地址 相当于 电话号码

IP 地址
  • 每台联网的电脑上都有 IP 地址是保证电脑之间正常通讯的重要设置

注意:每台电脑的 IP 地址不能相同,否则会出现 IP 地址冲突,并且没有办法正常通讯

ifconfig

  • ifconfig 可以查看/配置计算机当前的网卡配置信息

    1
    2
    3
    4
    5
    # 查看网卡配置信息
    $ ifconfig

    # 查看网卡对应的 IP 地址
    $ ifconfig | grep inet

    提示:一台计算机中有可能会有一个 物理网卡多个虚拟网卡,在 Linux 中物理网卡的名字通常以 ensXX 表示

  • 127.0.0.1` 被称为 本地回环/环回地址,一般用来测试本机网卡是否正常

ping

1
2
3
4
5
# 检测到目标主机是否连接正常
$ ping IP地址

# 检测本地网卡工作正常
$ ping 127.0.0.1
  • ping 一般用于检测当前计算机到目标计算机之间的网络 是否通畅数值越大,速度越慢
  • ping 的工作原理与潜水艇的声纳相似,ping 这个命令就是取自 声纳的声音
  • 网络管理员之间也常将 ping 用作动词 —— ping 一下计算机X,看他是否开着

原理:网络上的机器都有 唯一确定的 IP 地址,我们给目标 IP 地址发送一个数据包,对方就要返回一个数据包,根据返回的数据包以及时间,我们可以确定目标主机的存在

提示:在 Linux 中,想要终止一个终端程序的执行,绝大多数都可以使用 CTRL + C

远程登录和复制文件

ssh基础

在 Linux 中 SSH 是 常用 的工具,通过 SSH 客户端 我们可以连接到运行了 SSH 服务器 的远程机器上

  • SSH 客户端是一种使用 Secure Shell(SSH) 协议连接到远程计算机的软件程序
  • 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议
    • 利用 SSH 协议 可以有效防止远程管理过程中的信息泄露
    • 通过 SSH 协议 可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗
  • SSH 的另一项优点是传输的数据可以是经过压缩的,所以可以加快传输的速度

域名 和 端口号

域名
  • 由一串 用点分隔 的名字组成,例如:www.baidu.com
  • IP 地址 的别名,方便用户记忆
端口号
  • IP 地址:通过 IP 地址 找到网络上的 计算机
  • 端口号:通过 端口号 可以找到 计算机上运行的应用程序
    • SSH 服务器 的默认端口号是 22,如果是默认端口号,在连接的时候,可以省略
  • 常见服务端口号列表:
序号 服务 端口号
01 SSH 服务器 22
02 Web 服务器 80
03 HTTPS 443
04 FTP 服务器 21

SSH 客户端的简单使用

1
ssh [-p port] user@remote
  • user 是在远程机器上的用户名,如果不指定的话默认为当前用户
  • remote 是远程机器的地址,可以是 IP域名,或者是 后面会提到的别名
  • portSSH Server 监听的端口,如果不指定,就为默认值 22

提示:

  • 使用 exit 退出当前用户的登录

注意:

  • ssh 这个终端命令只能在 Linux 或者 UNIX 系统下使用
  • 如果在 Windows 系统中,可以安装 PuTTY 或者 XShell 客户端软件即可

提示:

  • 在工作中,SSH 服务器的端口号很有可能不是 22,如果遇到这种情况就需要使用 -p 选项,指定正确的端口号,否则无法正常连接到服务器

Windows 下 SSH 客户端的安装

建议从官方网站下载正式的安装程序

scp

  • scp 就是secure copy,是一个在Linux下用来进行 远程拷贝文件 的命令
  • 它的地址格式与ssh基本相同,需要注意的是,在指定端口时用的是大写的 -P 而不是小写的

1
2
3
4
5
6
7
8
9
10
11
12
13
# 把本地当前目录下的 01.py 文件 复制到 远程 家目录下的 Desktop/01.py
# 注意:`:` 后面的路径如果不是绝对路径,则以用户的家目录作为参照路径
scp -P port 01.py user@remote:Desktop/01.py

# 把远程 家目录下的 Desktop/01.py 文件 复制到 本地当前目录下的 01.py
scp -P port user@remote:Desktop/01.py 01.py

# 加上 -r 选项可以传送文件夹
# 把当前目录下的 demo 文件夹 复制到 远程 家目录下的 Desktop
scp -r demo user@remote:Desktop

# 把远程 家目录下的 Desktop 复制到 当前目录下的 demo 文件夹
scp -r user@remote:Desktop demo
选项 含义
-r 若给出的源文件是目录文件,则 scp 将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名
-P 若远程 SSH 服务器的端口不是 22,需要使用大写字母 -P 选项指定端口

注意:

  • scp 这个终端命令只能在 Linux 或者 UNIX 系统下使用
  • 如果在 Windows 系统中,可以安装 PuTTY,使用 pscp 命令行工具或者安装 FileZilla 使用 FTP 进行文件传输

FileZilla

ssh 免密登录

步骤

  • 配置公钥
    • 执行 ssh-keygen 即可生成 SSH 钥匙,一路回车即可
  • 上传公钥到服务器
    • 执行 ssh-copy-id -p port user@remote,可以让远程服务器记住我们的公钥

示意图

非对称加密算法

  • 使用 公钥 加密的数据,需要使用 私钥 解密
  • 使用 私钥 加密的数据,需要使用 公钥 解密
配置别名

每次都输入 ssh -p port user@remote,时间久了会觉得很麻烦,特别是当 user, remoteport 都得输入,而且还不好记忆

配置别名 可以让我们进一步偷懒,譬如用:ssh myserver 来替代上面这么一长串,那么就在(ssh客户端) ~/.ssh/config里面追加以下内容:

1
2
3
4
Host myserver
HostName ip地址
User yourName
Port 22

保存之后,即可用 ssh mac 实现远程登录了,scp 同样可以使用

ls 常用选项

ls 是英文单词 list 的简写,其功能为列出目录的内容,是用户最常用的命令之一

参数 含义
-a 显示指定目录下所有子目录与文件,包括隐藏文件
-l 以列表方式显示文件的详细信息
-h 配合 -l 以人性化的方式显示文件大小

ls 通配符的使用

* 代表任意个数个字符
? 代表任意一个字符,至少 1 个
[] 表示可以匹配字符组中的任一一个
[abc] 匹配 a、b、c 中的任意一个
[a-f] 匹配从 a 到 f 范围内的的任意一个字符

cd

cd 是英文单词 change directory 的简写,其功能为更改当前的工作目录,也是用户最常用的命令之一

注意:Linux 所有的 目录文件名 都是大小写敏感的

cd ~ 切换到当前用户的主目录(/home/用户目录)
cd . 保持在当前目录不变
cd .. 切换到上级目录
cd - 可以在最近两次工作目录之间来回切换

相对路径和绝对路径

  • 相对路径 在输入路径时,最前面不是 / 或者 ~,表示相对 当前目录 所在的目录位置
  • 绝对路径 在输入路径时,最前面是 / 或者 ~,表示从 根目录/家目录 开始的具体目录位置

创建和删除操作

touch

创建文件或修改文件时间

  • 如果文件 不存在,可以创建一个空白文件
  • 如果文件 已经存在,可以修改文件的末次修改日期

mkdir

  • 创建一个新的目录
选项 含义
-p 可以递归创建目录

新建目录的名称 不能与当前目录中 已有的目录或文件 同名

rm

  • 删除文件或目录

使用 rm 命令要小心,因为文件删除后不能恢复

选项 含义
-f 强制删除,忽略不存在的文件,无需提示
-r 递归地删除目录下的内容,删除文件夹 时必须加此参数

拷贝和移动文件

序号 命令 对应英文 作用
01 tree [目录名] tree 以树状图列出文件目录结构
02 cp 源文件 目标文件 copy 复制文件或者目录
03 mv 源文件 目标文件 move 移动文件或者目录/文件或者目录重命名

tree

  • tree 命令可以以树状图列出文件目录结构
选项 含义
-d 只显示目录

cp

  • cp 命令的功能是将给出的 文件目录 复制到另一个 文件目录 中,相当于 DOS 下的 copy 命令
选项 含义
-i 覆盖文件前提示
-r 若给出的源文件是目录文件,则 cp 将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名

mv

  • mv 命令可以用来 移动 文件目录,也可以给 文件或目录重命名
选项 含义
-i 覆盖文件前提示

查看文件内容

序号 命令 对应英文 作用
01 cat 文件名 concatenate 查看文件内容、创建文件、文件合并、追加文件内容等功能
02 more 文件名 more 分屏显示文件内容
03 grep 搜索文本 文件名 grep 搜索文本文件内容

cat

  • cat 命令可以用来 查看文件内容创建文件文件合并追加文件内容 等功能
  • cat 会一次显示所有的内容,适合 查看内容较少 的文本文件
选项 含义
-b 对非空输出行编号
-n 对输出的所有行编号

Linux 中还有一个 nl 的命令和 cat -b 的效果等价

more

  • more 命令可以用于分屏显示文件内容,每次只显示一页内容
  • 适合于 查看内容较多的文本文件

使用 more 的操作键:

操作键 功能
空格键 显示手册页的下一屏
Enter 键 一次滚动手册页的一行
b 回滚一屏
f 前滚一屏
q 退出
/word 搜索 word 字符串

grep

  • Linux 系统中 grep 命令是一种强大的文本搜索工具
  • grep允许对文本文件进行 模式查找,所谓模式查找,又被称为正则表达式,在就业班会详细讲解
选项 含义
-n 显示匹配行及行号
-v 显示不包含匹配文本的所有行(相当于求反)
-i 忽略大小写
  • 常用的两种模式查找
参数 含义
^a 行首,搜寻以 a 开头的行
a$ 行尾,搜寻以 a 结束的行

echo

  • echo 会在终端中显示参数指定的文字,通常会和 重定向 联合使用
  • 重定向 >>>
    • Linux 允许将命令执行结果 重定向到一个 文件
    • 将本应显示在终端上的内容 输出/追加指定文件中
    • > 表示输出,会覆盖文件原有的内容
    • >> 表示追加,会将内容追加到已有文件的末尾

管道 |

  • Linux 允许将 一个命令的输出 可以通过管道 做为 另一个命令的输入
  • 可以理解现实生活中的管子,管子的一头塞东西进去,另一头取出来,这里 | 的左右分为两端,左端塞东西(写),右端取东西(读)

常用的管道命令有:

  • more:分屏显示内容
  • grep:在命令执行结果的基础上查询指定的文本

exec

-exec 参数后面跟的是 command 命令,它的终止是以“;”为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

例如:

1
find . -name *.png -exec mv {} 移动目录/ \;

Linux 下的文件系统

Linux 下,我们是看不到这些驱动器盘符,我们看到的是文件夹(目录):

002_Ubuntu文件目录

Ubuntu 没有盘符这个概念,只有一个根目录 /,所有文件都在它下面

用户目录

位于 /home/user,称之为用户工作目录或家目录,表示方式:

1
~

Linux 主要目录速查表

  • /:根目录,

    一般根目录下只存放目录

    ,在 linux 下有且只有一个根目录,所有的东西都是从这里开始

    • 当在终端里输入 /home,其实是在告诉电脑,先从 /(根目录)开始,再进入到 home 目录
  • /bin、/usr/bin:可执行二进制文件的目录,如常用的命令 ls、tar、mv、cat 等

  • /boot:放置 linux 系统启动时用到的一些文件,如 linux 的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub

  • /dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱mount /dev/cdrom /mnt

  • /etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有

    • /etc/inittab
    • /etc/fstab
    • /etc/init.d
    • /etc/X11
    • /etc/sysconfig
    • /etc/xinetd.d
  • /home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下

    • ~ 表示当前用户的家目录
    • ~edu 表示用户 edu 的家目录
  • /lib、/usr/lib、/usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助

  • /lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下

  • /mnt: /media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载

  • /opt:给主机额外安装软件所摆放的目录

  • /proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的文件有:/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等

  • /root:系统管理员root的家目录

  • /sbin、/usr/sbin、/usr/local/sbin:放置系统管理员使用的可执行命令,如 fdisk、shutdown、mount 等。与 /bin 不同的是,这几个目录是给系统管理员 root 使用的命令,一般用户只能”查看”而不能设置和使用

  • /tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下

  • /srv:服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内

  • /usr:应用程序存放目录

    • /usr/bin:存放应用程序
    • /usr/share:存放共享数据
    • /usr/lib:存放不能直接运行的,却是许多程序运行所必需的一些函数库文件
    • /usr/local:存放软件升级包
    • /usr/share/doc:系统说明文件存放目录
    • /usr/share/man:程序说明文件存放目录
  • /var:放置系统执行过程中经常变化的文件

    • /var/log:随时更改的日志文件
    • /var/spool/mail:邮件存放的目录
    • /var/run:程序或服务启动后,其 PID 存放在该目录下

1
2
# \ 表示结束  {} 表示find搜索的结果
find . -name *.png -exec mv {} 移动目录/ \;

iOS10 废弃了 UILocalNotification,采用了新的UserNotifications Framework来推送通知。

注册推送

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
#import <UserNotifications/UserNotifications.h>
#import "AppDelegate.h"
@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

if (@available(iOS 10.0, *)) {
// 使用 UNUserNotificationCenter 来管理通知
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
//监听回调事件
//center.delegate = self;

//iOS 10 使用以下方法注册,才能得到授权,注册通知以后,会自动注册 deviceToken,如果获取不到 deviceToken,Xcode8下要注意开启 Capability->Push Notification。
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {

}];

//获取当前的通知设置,UNNotificationSettings 是只读对象,不能直接修改,只能通过以下方法获取
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {

}];
}

return YES;
}

@end

使用本地通知

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105

- (void)showLocalNotificationWithTitle:(NSString *)title notificationId:(NSString *)notificationId {

if (@available(iOS 10.0, *)) {

//新增前先清楚已注册的相同ID的本地推送
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center removePendingNotificationRequestsWithIdentifiers:@[notificationId]];

//创建一个通知内容对象
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = [NSString localizedUserNotificationStringForKey:title arguments:nil];
//content.body = [NSString localizedUserNotificationStringForKey:@"消息" arguments:nil];
// content.sound = [UNNotificationSound defaultSound];
content.userInfo = @{kClickLocalNotification: notificationId};

//设置n秒后推送
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO];

UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:notificationId content:content trigger:trigger];

//添加
[center addNotificationRequest:request withCompletionHandler:nil];
}
else {

//新增前先清楚已注册的相同ID的本地推送
[self deleteLocadNotificationWithNotificationId:notificationId];

UILocalNotification *notification = [[UILocalNotification alloc] init];
//触发通知的时间
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
//时区
notification.timeZone = [NSTimeZone defaultTimeZone];

//重复次数 kCFCalendarUnitEra为不重复
notification.repeatInterval = kCFCalendarUnitEra;

//通知内容
notification.alertBody = title;
notification.applicationIconBadgeNumber = 0;
//通知声音
notification.soundName = UILocalNotificationDefaultSoundName;
//通知dict
notification.userInfo = @{kClickLocalNotification: notificationId};

// ios8后,需要添加这个注册,才能得到授权
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge; //不使用UIUserNotificationTypeSound
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type
categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

} else {

}

//执行通知注册
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
}


- (void)deleteLocadNotificationWithNotificationId:(NSString *)notificationId {

if (@available(iOS 10.0, *)) {

/*
removePendingNotificationRequestsWithIdentifiers 删除特定等待递送的通知
removeDeliveredNotificationsWithIdentifiers //删除特定已经递送的通知
*/
[[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers:@[notificationId]];
}
else {
UILocalNotification * notification = [self queryNotificationWithNotificatioId:notificationId];

if (notification) {
[[UIApplication sharedApplication] cancelLocalNotification:notification];
}
}
}


//查询符合条件的本地推送
- (UILocalNotification *)queryNotificationWithNotificatioId:(NSString *)notificatioId {
NSArray * notifications = [self queryAllSystemNotifications];
__block UILocalNotification * localnotification = nil;

if (notifications.count > 0) {
[notifications enumerateObjectsUsingBlock:^(UILocalNotification * obj, NSUInteger idx, BOOL * _Nonnull stop) {
//查找符合条件的本地推送
if ([obj.userInfo containsObjectForKey:kClickLocalNotification] && [obj.userInfo[kClickLocalNotification] isEqualToString:notificatioId]) {
localnotification = obj;
*stop = YES;
}
}];
}
return localnotification;
}


//查询所有已注册的本地推送
- (NSArray *)queryAllSystemNotifications {
return [[UIApplication sharedApplication] scheduledLocalNotifications];
}
1
2
getPendingNotificationRequestsWithCompletionHandler:  //获取所有等待递送的通知
getDeliveredNotificationsWithCompletionHandler: //获取所有已经递送的通知

1. 先删除原有的.DS_Store

1
find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch1

命令解释:在当前文件夹以及当前文件夹的子文件夹中找到所有的.DS_Store文件,并将找到的文件通过管道传给xargs来处理。注意几个参数的理解:
-print0:在find后不添加换行符(-print默认会添加换行符)
-0:将管道送来的字符串当做普通的字符串,不做任何转义处理。

2. 建立.gitignore文件

vi .gitignore。然后添加.DS_Store作为忽略:shell

1
*/.DS_Store

3. 提交到git

1
2
git add .gitignore
git commit -m 'delete .DS_Store'