Ubuntu配置
Ubuntu配置
一. 命令
1. ls 命令
-a
列出所有
-l
.
-h
增加可读性
-R
递归
-Q
文件用双引号打印出来
2. echo 命令
显示字符串
echo Hello World echo "Hello World"
显示转义字符。使用
\
echo "\"Hello World!\""
显示变量。使用
$
echo $PATH
显示换行/不换行。
echo -e "Hello \n World" echo -e "Hello \c World" 不换行
显示原样字符串
echo '$PATH'=$PATH
显示命令结果
echo `date` `time`
3. cd 命令
Change Directory
~
表示当前用户
4. head 命令
-c n
显示头部的指定 n 个字符
head -c 2 hello.txt
-n x
显示头部的指定的 x 行
head -n 2 hello.txt
-v
显示文件名
head -v -n 2 hello.txt
-q
不显示文件名(默认就是带 -q)
5. tail 命令
-f
可以不断地更新尾部内容
tail -f hello.txt
-n x
显示尾部 x 行的内容
tail -n 2 hello.txt
-c n
显示头部的指定 n 个字符
tail -c 20 hello.txt
6. ps 命令
-AL
显示所有进程的详情和进程名称
ps -AL
-aux
显示所有进程和其启动命令
ps -aux
7. cp 命令
-a
带属性复制。通常用在复制目录时,它保留链接、文件属性,并复制目录下的所有内容,其作用等于 dpR 参数组合。
-d
复制时保留链接
-f
强制覆盖。覆盖已经存在的目标文件而不给出提示
-p
带权限复制。如修改时间、访问权限
-r
文件夹复制
-l
创建链接
8. rm 命令
-i
删除确认
-f
强制删除
-r
目录删除
9. chmod
777 (111 111 111)
当前用户、当前用户组、其它用户。读、写、执行
10. 解压命令
1、.tar 用 tar –xvf 解压
2、.gz 用 gzip -d或者gunzip 解压
3、.tar.gz 和.tgz 用 tar –xzf 解压
4、.bz2 用 bzip2 -d或者用bunzip2 解压
5、.tar.bz2用tar –xjf 解压
6、.Z 用 uncompress 解压
7、.tar.Z 用tar –xZf 解压
8、.rar 用 unrar e解压
9、.zip 用 unzip 解压
10、tar.xz tar -xvf
<br/><br/>
11. SSH 免密登录
首先在本机生成公钥和私钥
ssh-kegen -t rsa
在远程服务器上也生成公钥和私钥
ssh-kegen -t rsa
在服务器上, 将主机的公钥复制到
~/.ssh/authorized_keys
文件中
<br/><br/>
12 上传下载文件
上传
scp 文件路径 目的地用户名@目的地ip:目的地路径
scp file user@ip:/directory ##上传文件
scp -r dir user@ip:/directory ##长传目录
下载
scp user@ip:/filename /direcotry ##下载文件
scp -r user@ip:/directory /direcotry ##下载目录
scp 远程服务器用户名@远程服务器ip:远程文件路径 本地存放路径
scp -r 远程服务器用户名@远程服务器ip:远程文件路径 本地存放路径
<br/><br/>
二. Linux 开发入门
1. 开发环境搭建
gcc 安装
ssh 服务安装
2. Linux 标准库函数
字符串函数
#include <ctype.h>
测试字符是否为英文或数字
int isalnum(int c)
测试字符是否是英文字母
int isalpha(int c)
测试字符是否为 ASCII 码字符
int isascii(int c)
测试字符是否为空格字符
int isblank(int c)
测试字符是否为 ASCII 码的控制字符
int iscntrl(int c)
测试字符是否为阿拉伯数字
int isdigit(int c)
测试字符是否为可打印字符
int isgraph(int c)
测试字符是否为小写英文字母
int islower(int c)
测试字符是否为可打印字符
int isprint(int c)
测试字符是否为空格字符
int isspace(int c)
测试字符是否为标点符号或特殊符号
int ispunct(int c)
测试字符是否为大写英文字母
int issuper(int c)
测试字符是否为 16 进制数字
int isxdigit(int c)
数据转换函数
#include <stdlib.h>
将字符串转换为浮点型数
double atof(const char* str)
将字符串转换为整型数
int atoi(const char* str)
将字符串转换成长整型数
long int atol(const char* str)
将字符串转换成 64 位整数(C++11)
long long int atoll(const char* str)
将字符串转换成整数
long int strtol(const char* str, char ** endptr, int base)
base 指进制: 2、8、10
strtoll("1234567891000", NULL, 10) // 示例
char *pEnd; strtoll("123456789abc", pEnd, 10); // pEnd 将指向 abc
将字符串转换成先符号整数
unsigned long int strtoul(const char* str, char **endptr, int base)
将字符串转换成长整数(C++11)
long long int strtoll(const char* str, char **endptr, int base)
将字符串转换成无符号长整数(C++11)
unsigned long long int strtoull(const char*, char **endptr, int base)
将字符串转换成浮点数(C++11)
float strtof(const char *str, char **endptr)
将字符串转换成双精度数
double strtod(const char *str, char **endptr)
将字符串转换成长双精度数(C++11)
long double strdold(const char *str, char **endptr)
将浮点型数增加的成字符串
char *evt(double value, int ndigit, int *decpt, int *sign)
Value: 输入要转换的数
ndigit: 指的是全部的有效位数
decpt: 返回小数点的下标
sign: 返回符号。正数为0, 负数为1
int decpt, sign; char *res = evt(-123.456789, 9, &decpt, &sign); // res: 123456789。decpt: 3。sign: 1
将浮点型数转换为字符串
char *fcvt(double value, int ndigit, int *decpt, int *sign)
ndigit: 小数点之后的有效位
将浮点型数转换为字符串
char *gcvt(double value, int ndigit, char *buf)
buf 和返回值是一样的
char buf[1238]; char *res = gcvt(0.123, 5, buf); // res: 0.123 char *res = gcvt(-0.456, 5, buf); // res: -0.456
格式化输入输出函数
格式化输出数据
int printf(const char *format);
格式化输出数据(可变长)
int vprintf(const char *format, va_list arg);
#include <stdarg.h> void test(const char *format, ...) { va_list ap; va_start(ap, format); vprintf(format, ap); va_end(); }
格式化字符串输入
int scanf(const char *format, ...)
空格是默认的分隔符
格式化字符串复制
int sprintf(char *str, const char *format, ...); int sprintf(char *str, size_t size, cosnt char *format, ...);
格式化字符串输入
int sscanf(const char *str, cosnt char *format, ...);
格式化字符串复制
int vsnprintf(char *s, size_t n, const char *format, va_list arg); int vsprintf(char *str, const char *format, va_list arg);
格式化字符串输入
int vsscanf(const char *s, const char *format, va_list arg);
格式化输出至文件
int vfprintf(FILE *stream, const char *format, va_lit arg);
格式化文件字符串输入
int vfscanf(FILE *stream, const char *format, va_list arg);
格式化输出数据至文件
int fprintf(FILE *stream, const char *format, ...);
权限控制函数
Linux 权限说明
出于在 Linux 一切皆文件,所以这些权限对进程、内存都是有效的
- 设置用户权限: S 提权和降权
- 设置组权限: s
- 仅所有者可删除权限: t
- 读取权限:r(Read) 4(100)
- 写入权限:w(Write) 2(010)
- 执行权限:x(Execute) 1(001)
所有者
所在组
其它组
drwxr-xr-x
d: 表示这是个目录
rwx: 所有者的权限
r-x: 所在组的权限
r-x: 其它组的权限
#include <unistd.h>
#include <sys/types.h>
取得有效的用户识别码
uid_t geteuid(void);
真实的用户 r
:当下程序所拥有的用户状态有效的用户 e:程序启动时所拥有的用户状态
0: root
1000~10000(不包含10000):system、数据库、服务 tty 保留的用户
10000及以上: 其它用户
Android 每个应用会分配一个用户(系统应用例外)
取得真实的用户识别码
uid_t getuid(void);
取得真实的组织识别码
gid_t getgid(void);
设置真实的用户识别码
int setuid(uid_t uid);
设置有效的用户识别码
int seteuid(uid_t uid);
设置真实及有效的用户识别码
int setreuid(uid_t uid, uid_t euid);
设置真实及有效的组识别码
int setregid(gid_t rgid, gid_t egid);
设置有效的组识别码
int setegid(gid_t egid);
设置真实的组识别码
int setgid(gid_t gid);
创建会话 ID (只能是子进程调用):
pid_t setsid(void);
I/O 函数
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
打开文件
int open(const char *pathname, int flags, mode_t mode)
flags:
- O_RDONLY: 只读
- O_WRONLY: 只写
- O_RDWR: 读、写
- O_CREAT: 若文件不存在,则创建它,需要使用 mode 选项。来指明新文件的访问权限
- O_APPEND: 追加写
mode:
- S_IRUSR、S_IWUSR、S_IXUSR 所有者的读、写、执行
- S_IRGRP、S_IWGRP、S_IXGRP 所属组的读、写、执行
- S_IROTH、S_IWOTH、S_IXOTH 其它用户的读、写、执行
创建文件
int create(const char *pathname, mode_t mode)
#include <unistd.h>
从打开的文件读取文件数据
ssize_t read(int fd, void *buf, size_t count)
从打开的文件写入文件数据
ssize_t write(int fd, const void *buf, size_t count)
关闭文件
int close(int fd)
复制文件描述符
int dup(int oldfd)
复制文件描述符到新的文件描述符中去
int dup2(int oldfd, int newfd)
文件控制
int fcntl(int fd, int cmd, .../* arg */)
文件数据同步(将缓存中的数据写入到磁盘)
int fsync(ind fd)
文件读写位置修改
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence)
whence:
SEEK_SET: 参数 offset 即为新的读写位置
SEEK_CUR: 以目前的读写位置往后增加 offset 个位移量
SEEK_END 将读写位置指向文件尾后再增加 offset 个位移量。
当 whence 值为 SEEK_CUR 或 SEEK_END 时,offset 可以为负值
#include<stdlib.h>
// 创建临时文件--文件是临时的,不保证数据长期有效
int mkstemp(char *template);
// template: 前缀XXXXXX
文件锁操作
int flock(int fd, int operation)
operation:
- LOCK_SH: 建立共享锁定。多个进程可同时对同一个文件作共享锁定
- LOCK_EX: 建立互斥锁定。一个文件同时只有一个互斥锁定
- LOCK_UN: 解除文件锁定状态。文件被关闭时自动解锁
- LOCK_NB: NoneBlock 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与 LOCK_SH 或 LOCK_EX 做 OR(|) 组合
文件控制 (打开、关闭、读取、写入、控制)
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */)
int fcntl(int fd, int cmd)
int fcntl(int fd, int cmd, long arg)
int fcntl(int fd, int cmd, struct flock *lock) // ==> F_GETLK F_SETLK
cmd:
- F_DUPDF: 用来查找大于或等于参数 arg 的最小且仍未使用的文件描述符,并且复制参数 fd 的文件描述符。执行成功则返回新复制的文件描述符。新描述符与 fd 共享同一文件表项,但是新描述符有它自己的一套文件描述符标志,其中 FD_CLOEXEC 文件描述符标志被清除
- F_GETDF: 取得 close-on-exec 标志。若此标志的 FD_CLOEXEC 位为 0,代表在调用 exec() 相关函数时文件将不会关闭
- F_GETFL: FL(Flags) 取得文件描述符状态标志,此标志为 open() 的参数 flags。
- F_SETFL: 设置文件描述符状态标志,参数 arg 为新标志,但只允许 O_APPEND、O_NONBLOCK、O_ASYNC 位的改变,其它位的改变将不受影响
- F_GETLK: LK(Lock) 取得文件锁定的状态
- F_SETLK: 设置文件锁定的状态。此时 flock 结构的 l_type 值必须是 F_RDLCK、F_WRLCK 或 F_UNLCK。如果无法建立锁定,则返回 -1,错误代码为 EACCES 或 EAGAIN
- F_SETLKW(wait)、F_SETLK 作用相同,但是无法建立锁定时,此调用会一直等到锁定动作成功为止。若在等待锁定的过程中被信号中断时,会立即返回 -1,错误代码为 EINTR
<br/>
进程控制函数
执行文件
#include <unistd.h> int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ..., char *const evnp[]); int execvp(const char *file, char * const argv[]); int execve(const char *filename, char *const argv[], char * const envp[]) //内核级别调用
- l: 进程执行的参数, 以可变参数的形式给出, 这些参数以 NULL 为最后一个参数
- p: exec 会将当前的 PATH 作为一个参考环境变量, 比如 file 不用写绝对路径,可以用相对路径
- e: 进程函数会需要用户来设置这个环境变量 evnp
- v: 进程函数会用参数数组来传递 argv, 数组最后一个成员需要是 NULL
建立一个新进程
pid_t fork(void);
pid_t:
- 大于 0 的数, 此时就是父进程
- 等于 0 的数, 此时就是子进程
- 小于 0 的数, 表示创建失败
- 以异常方式结束进程
void abort(void);
- 若测试的条件不成立则终止进程
#include <assert.h> void assert(int expression); // expression 不成立才触发
- 正常结束进程
void exit(int status);
- 设置程序正常结束前调用的函数
int atexit(void(*func)(void));
设置程序正常结束前调用的函数
int on_exit(void (*function)(int, void*), void *arg);
- 结束进程执行
void _exit(int status); // 直接结束,不会触发其它的
#include <setjmp.h> jmp_buf jmpbuf; // 建议设置成全局变量
保存目前堆栈环境
int setjmp(jmp_buf environment);
jmp_buf: 存储的是寄储器信息
跳转到原先 setjmp 保存的堆栈环境
void longjmp(jmp_buf environment, int value);
改变进程优先顺序: 跳转到原先 sigsetjmp 保存的堆栈环境
void siglongjmp(sigjmp_buf env, int val);
sigjmp_buf 除了缓存寄存器,还会缓存上下文(堆栈、当前的寄存器、当前的状态、下一条指令位置...)
保存目前堆栈环境
int sigsetjmp(sigjmp_buf env, int savemask);
作用是可以实现异常捕获、逆向中拿到上下文进行修改某些东西
取得进程组识别码
pid_t getpgid(pid_t pid);
取得当前进程组识别码
pid_t getpgrp(void);
取得进程识别码
pid_t getpid(void);
取得父进程的进程识别码
pid_t getppid(void);
取得程序进程执行优先权
#include <sys/resource.h> int getpriority(int which, int who);
设置进程组识别码
int setpgid(pid_t pid, pid_t pgid);
设置进程组识别码
int setpgrp(void);
设置程序进程执行优先权
int setpriority(int which, int who, int prio);
改变进程优先级
int nice(int inc);
注:修改优先级需要权限,一般是有效用户的权限(即启动程序的那个用户)
执行 shell 命令
#include <stdlib.h> int system(char *command);
等待子进程中断或结束, 一般和 fork 配套使用
#include <sys/types.h> #include <sys/wait.h> int wait(int *status); pid_t waitpid(pit_t pid, int *status, int options);
status:
WIFEXITED: if exited
WIFSIGNALED
WIFSTOPPED
WEXITSTATUS
WTERMSIG
WSTOPSIG
options:
- WNOHANG: no hang 非阻塞
- WUNTRACED: under traced 被调试
- WCONTINUED: continued 发生了信号导致进程暂停
文件和目录函数
文件操作函数
打开文件
FILE *fopen(const char *path, const char *mode); // 不能指定权限
mode:
- r: 读
- w: 写
- r+ 、w+: 可读可写
- +: 创建
- a: 追加
- b: 二进制
- t: 文本 (默认的)
关闭文件
fclose(FILE *fp);
打开文件-文件输入输出重定向
FILE *freopen(const char *filename, const char *mode, FILE *stream);
// 示例: 把控制台输出导到文件中 FILE *pFile = freopen("./test.txt", "a+", stdout); std::cout << std::endl; std::cout << __FILE__ << ":" << __LINE__ << " " << __FUNCTION__ << std::endl; if (nullptr != pFile) fclose(pFile);
将文件描述词转为文件指针
用 open 函数打开的时候, 得到一个 fd, 可以把文件描述符转换为 FILE *
FILE *fdopen(int fildes, const char *mode);
返回文件流所使用的文件描述词
文件指针转换为文件描述符 (fd: file describtion)
int fileno(FILE *stream);
从文件流读取数据
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
由文件中读取一字符串
int fgetc(FILE *stream);
由文件中读取一字符串
char *fgets(char *str, int n, FILE *stream); // 文件必须以 t 模式打开
将数据写至文件流
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
更新缓冲区
int fflush(FILE *stream);
将一指定字符写入文件流中
int fputc(int c, FILE *fp);
将一指定的字符串写入文件内
int fputs(const char *str, FILE *stream);
将数据写入至文件流
size_t fwrite(const char *ptr, size_t size, size_t nmemb, FILE *stream);
更新缓冲区
int fflush(FILE *stream);
printf 函数 format 详解
scanf 函数 format 详解
3. 网络编程基础
网络的基本概念
网络的物理结构
网络中的地址
网络的中的端口
什么是协议
TCP协议基础
套接字介绍
套接字的创建
地址和端口的设置
绑定地址和端口
监听和接受连接
数据的读取和发送
连接服务器
接收和发送数据
关闭连接
错误处理
三. WSL
1. WSL微软官方教程
适用于 Linux 的 Windows 子系统文档 | Microsoft Learn
2. 固定IP
Set ws = WScript.CreateObject("WScript.Shell")
ws.run "wsl -d CentOS7 -u root sudo service sshd start", vbhide
ws.run "wsl -d CentOS7 -u root ip addr add 172.28.131.101/20 broadcast 172.28.143.255 dev eth0 label eth0:1", vbhide
netsh interface ip add address "vEthernet (WSL)" 172.28.131.102 255.255.240.0
四. clash配置
下载软件
wget https://gitee.com/wzqxxl/transit/attach_files/1047328/download/clash-linux-amd64-v1.10.0.gz
配置订阅链接
wget -O config.yaml 这里改成你的订阅链接
wget -O Country.mmdb https://gitee.com/wzqxxl/transit/attach_files/1047342/download/Country.mmdb
文件结构
给clash赋予权限
sudo chmod +x clash1.10.0
运行
./clash1.10.0 -d .
后台运行
screen -S clash /usr/local/src/clash/clash1.10.0 -d /usr/local/src/clash/
<br/><br/>
五. 更换源
备份原来的文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
查看codename(该版本系统的代号)
lsb_release -a
阿里源
将 $Codename
替换为上面获取的 Codename 即可
sudo vim /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ $Codename main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-backports main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-proposed main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-security main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-updates main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-backports main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-proposed main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-security main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-updates main multiverse restricted universe
sudo apt update
六. 依赖项安装
sudo apt-get install -y gcc cmake gdb net-tools openssl curl build-essential libtool ca-certificates gnupg lsb-release git-core bison libreadline6-dev zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 autoconf libc6-dev libpcre3-dev libcurl4-nss-dev libxml2-dev libxslt-dev imagemagick libffi-dev firewalld
## 七. sudo apt-get install -y python3-pip python3-dev python-dev
八. 安装proxychains
sudo apt-get install -y proxychains
将 dns 这行注释掉
vim /etc/proxychains.conf
Clash(或者其它代理软件) 打开局域网连接
设置代理列表,
类型 空格 IP 空格 端口
http 192.168.1.206 7890 https 192.168.1.206 7890 socks5 192.168.1.206 7890
使用
只需要在命令前面加上
proxychains
即可proxychains curl google.com
<br/><br/>
九. 终端美化与加强
1. 安装 zsh
查看系统是否装了 zsh
查看当前使用的 shell
echo $SHELL
查看系统是否装了 zsh
cat /etc/shells
安装 zsh(系统没有查到zsh,则安装)
sudo apt-get install -y zsh
切换 shell 为 zsh
chsh -s /bin/zsh
sudo chsh -s /bin/zsh
重启Linux
sudo reboot
开机后,zsh 会要求用户选择启动项。
输入 0 即可
查看当前 shell , 如果显示 /bin/zsh ,则配置成功
sudo echo $SHELL
安装 oh my zsh
sh -c "$(wget https://gitee.com/wzqxxl/ohmyzsh/releases/download/%E6%96%87%E4%BB%B6/install.sh -O -)"
到此就安装完成
更换主题
vim ~/.zshrc
修改 ZSH_THEME
参数即可。之后执行即可更换主题:gnzh
source ~/.zshrc
使用 powerlevel10k 主题
git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
ZSH_THEME="powerlevel10k/powerlevel10k"
2. oh-my-zsh插件
智能提示
git clone https://gitee.com/xs66/zsh-autosuggestions $ZSH/plugins/zsh-autosuggestions
语法高亮
git clone https://gitee.com/xs66/zsh-syntax-highlighting.git $ZSH/plugins/zsh-syntax-highlighting
载入配置
vim ~/.zshrc
plugins=(
git
extract
cp
safe-paste
colored-man-pages
zsh-syntax-highlighting
zsh-autosuggestions
)
使配置生效
source ~/.zshrc
<br/><br/>
十. Vim
1. 配置 Vim
sudo vim ~/.vimrc
参考配置文件:
set number "设置行号
syntax on "高亮
colorscheme tender "设置主题---主题文件夹:/usr/share/vim/vim82/colors
set mouse=a "鼠标模式
set encoding=utf-8 "编码设置
set noswapfile
set laststatus=2 "总是显示状态行
set autoindent "自动缩进
set shiftwidth=4 "缩进长度是4
set softtabstop=-1 "Backspace键来一次删除4个空格
set showmatch "高亮显示匹配的括号
set hlsearch "高亮显示所有搜索到的内容
set incsearch "光标立刻跳转到搜索到内容
set noeb "去掉输入错误时的提示声音
set backspace=indent,eol,start "让Backspace键可以往前删除字符
set statusline=%F%r\ [HEX=%B][%l,%v,%P]\ %{strftime(\"%H:%M\")} "设置状态行显示的内容
" %F: 显示当前文件的完整路径.
" %r: 如果readonly,会显示[RO]
" %B: 显示光标下字符的编码值,十六进制.
" %l:光标所在的行号. %v:光标所在的虚拟列号.
" %P: 显示当前内容在整个文件中的百分比.
" %H和%M是strftime()函数的参数,获取时间.
" 快捷输入--自动完成括号和引号
inoremap ' ''<ESC>i
inoremap " ""<ESC>i
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
inoremap { {}<ESC>i
2. 更改主题
下载主题
注:将路径改为自己的,例如,你可能是
/usr/share/vim/vim9
,也可能是/usr/share/vim/vim8
sudo wget -O /usr/share/vim/vim81/colors/tender.vim https://gitee.com/wzqxxl/transit/attach_files/1114920/download/tender.vim
sudo wget -O /usr/share/vim/vim80/colors/tender.vim https://gitee.com/wzqxxl/transit/attach_files/1114920/download/tender.vim
- 注:MacOS下无法访问/usr/目录,则在根目录下文件夹
~/.vim/colors
,将主题文件放在该目录下即可 - -O 参数表示将下载内容保存到所指定的文件
- 主题文件所在文件夹:
/usr/share/vim/vim82/colors
- 注:MacOS下无法访问/usr/目录,则在根目录下文件夹
设置
~/.vimrc
配置主题sudo vim ~/.vimrc
colorscheme tender "设置主题
更多主题
3. vim-plug 插件管理 安装
GitHub 主页:https://github.com/junegunn/vim-plug
下载
vim-plug
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://gitee.com/wzqxxl/transit/attach_files/1114918/download/plug.vim
编辑
.vimrc
vim ~/.vimrc
一些插件
安装插件:
vim
如果配置了代理,安装了
proxychains
,则可以用下面这条命令proxychains vim
按
<kbd>
Shift</kbd>
+<kbd>
:</kbd>
进入命令模式,输入PlugInstall
<font color="grey">
【注】由于插件是去 GitHub 下载,而国内网络无法连接,故需要靠科学上网</font>
4. 自动补全插件 coc 安装
GitHub 主页:https://github.com/neoclide/coc.nvim
编辑 .vimrc
:
Plug 'neoclide/coc.nvim', {'branch': 'release'}
运行 PlugInstall
5. 自动补全插件 YCM 安装
cd ~/.vim/plugged/YouCompleteMe
python3 ./install.py --clangd-completer --force-sudo
配置 vimrc
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<c-b>"
let g:UltiSnipsJumpBackwardTrigger="<c-z>"
" If you want :UltiSnipsEdit to split your window.
let g:UltiSnipsEditSplit="vertical"
" 自动补全配置
set completeopt=longest,menu "让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" "回车即选中当前项
"上下左右键的行为 会显示其他信息
inoremap <expr> <Down> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up> pumvisible() ? "\<C-p>" : "\<Up>"
inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"
inoremap <expr> <PageUp> pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"
"youcompleteme 默认tab s-tab 和自动补全冲突
"let g:ycm_key_list_select_completion=['<c-n>']
let g:ycm_key_list_select_completion = ['<Down>']
"let g:ycm_key_list_previous_completion=['<c-p>']
let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎
let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR> "force recomile with syntastic
"nnoremap <leader>lo :lopen<CR> "open locationlist
"nnoremap <leader>lc :lclose<CR> "close locationlist
inoremap <leader><leader> <C-x><C-o>
"在注释输入中也能补全
let g:ycm_complete_in_comments = 1
"在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
"注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> "
<br/><br/>
十一. 安装 Miniconda
Index of miniconda 清华大学开源软件镜像站
<br/><br/>
十二. 安装 workon
<br/><br/>
十三. 编程环境
1. Python
下载
wget https://www.python.org/ftp/python/3.7.16/Python-3.7.16.tar.xz
解压
tar -xvf Python-3.7.16.tar.xz
配置安装路径
./configure prefix=/usr/local/src/Python
编译和安装
make && make install
创建软链接
sudo ln -s /usr/local/src/Python/bin/python3.7 /usr/bin/python
sudo ln -s /usr/local/src/Python/bin/pip3 /usr/bin/pip
更换 pip 源
vim ~/.pip/pip.conf
添加以下内容:
[global]
timeout = 6000
index-url = https://pypi.doubanio.com/simple
trusted-host = pypi.doubanio.com
2. PCRE 库
PCRE 库源码包下载地址: https://sourceforge.mirrorservice.org/p/pc/pcre/pcre/8.39/pcre-8.39.tar.gz
下载
wget https://sourceforge.mirrorservice.org/p/pc/pcre/pcre/8.39/pcre-8.39.tar.gz
解压
sudo tar -zxvf pcre-8.39.tar.gz
配置
sudo ./configure
编译和安装
sudo make && sudo make install
zlib 库
下载
wget https://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz
解压
sudo tar -zxvf zlib-1.2.11.tar.gz
配置
sudo ./configure
编译和安装
sudo make && sudo make install
3. OpenSSL 开发库
下载
sudo wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
解压
sudo tar -zxvf openssl-1.1.1g.tar.gz
配置
sudo ./config
编译和安装
sudo make && sudo make install
4. Nginx
下载
sudo wget http://nginx.org/download/nginx-1.16.1.tar.gz
解压
sudo tar -zxvf nginx-1.16.1.tar.gz
配置安装路径、模块
sudo ./configure --prefix=/usr/local/src/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module
编译
sudo make && sudo make install
创建软链接
ln -s /usr/local/src/nginx/sbin/niginx /usr/bin/nginx
5. FastDFS
libfastcommon 的安装
libfastcommon 为 FastDFS 操作的基础库,FastDFS 没有使用标准的库,而是封装了一套和 FastDFS 相关的库。
下载
wget https://gitee.com/wzqxxl/transit/releases/download/FastDFS/libfastcommon-1.0.43.tar.gz
解压
sudo tar -xzvf libfastcommon-1.0.43.tar.gz
编译代码、安装
sudo ./make.sh && sudo ./make.sh install
动态库安装后的路径
安装成功后,默认会复制到 /usr/lib64 下
设置环境变量或者创建软链接
export LD_LIBRARY_PATH=/usr/lib64/:$LD_LIBRARY_PATH
sudo ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
FastDFS 的安装
FastDFS 源代码下载地址: https://code.google.com/archive/p/fastdfs/downloadshttps://github.com/happyfish100/fastdfs.git 这里使用的是 V6.06 版本
下载
wget https://gitee.com/wzqxxl/transit/releases/download/FastDFS/fastdfs-6.06.tar.gz
解压
sudo tar -zxvf fastdfs-6.06.tar.gz
编译、安装
sudo ./make.sh && sudo ./make.sh install
可执行程序默认会安装到/usr/bin 中:
安装成功后,自动在 /etc/fdfs 中添加三个配置文件:
FastDFS 的配置
先配置 tracker,再添加一个 storage,每添加添加一个 storage,实际上是 storage 连接 tracker,tracker 必须存在,否则 storage 无法加进来,client 主要用于测试上传、下载文件。
tracker 的配置
拷贝配置文件
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
修改 配置文件
sudo vim /etc/fdfs/tracker.conf
- tracker 所在服务器的 ip
- tracker 日志存放的路径 (此路径必须已经存在,不然后面会报错)
storage 的配置
拷贝配置文件
sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
修改 配置文件
sudo vim /etc/fdfs/storage.conf
storage 所在服务器 ip
storage 存放日志的路径 (此路径必须已经存在,不然后面会报错)
真正存储数据的路径
指定 tracker 服务器地址和端口。不能是 127.0.0.1
client 的配置
拷贝配置文件
sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
修改 配置文件
sudo vim /etc/fdfs/client.conf
base_path
tracker_server
启动服务
启动 tracker
sudo /usr/local/src/file/fastdfs/fastdfs-6.06/tracker/fdfs_trackerd /etc/fdfs/tracker.conf
ps -aux | grep fdfs
启动 storage
sudo /usr/local/src/file/fastdfs/fastdfs-6.06/storage/fdfs_storaged /etc/fdfs/storage.conf
拷贝 fdfs_trackerd 和 fdfs_storaged 到 /usr/bin 目录
sudo cp -rf /usr/local/src/file/fastdfs/fastdfs-6.06/tracker/fdfs_trackerd /usr/bin
sudo cp -rf /usr/local/src/file/fastdfs/fastdfs-6.06/storage/fdfs_storaged /usr/bin
FastDFS 客户端
测试 storage 状态
storage server 的状态通常有七种
通过 fdfs_monitor 测试 storage 状态,正常状态必须是 ACTIVE,否则无法上传、下载文件:
fdfs_monitor /etc/fdfs/client.conf
上传、下载文件测试
在 client 所在的机器完成上传测试
fdfs_upload_file /etc/fdfs/client.conf test.txt
文件上传到 storage 所在的服务器:
在 client 所在的机器完成下载、删除测试:
下载:
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/rBj_CGPHX-qAZ1itAAAADK8IOy0245.txt
删除:
fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/rBj_CGPHX-qAZ1itAAAADK8IOy0245.txt
上传文件源码简析
FastDFS 源码中提供了 client 实现的相应源码 fdfs_upload_file.c
:
6. FastCGI
spawn-fcgi
spawn-fcgi 源码包下载地址:http://redmine.lighttpd.net/projects/spawn-fcgi/wiki
解压
sudo tar -zxvf spawn-fcgi-1.6.4.tar.gz
配置
sudo ./configure
编译安装
sudo make && make install
创建软连接
sudo ln -s /usr/local/src/file/fastcgi/spawn-fcgi-1.6.4/src/spawn-fcgi /usr/bin/spawn-fcgi
7. 软件开发套件 fcgi
使用 C/C++编写 FastCGI 应用程序,可以使用 FastCGI 软件开发套件或者其它开发框架,如 fcgi 。
fcgi 下载地址:wget https://fossies.org/linux/www/old/fcgi-2.4.0.tar.gz
解压
sudo tar -zxvf fcgi-2.4.1-SNAP-0910052249.tar.gz
配置
sudo ./configure
编译安装
sudo make && make install
sudo ln -s /home/xxl/fastdfs/storage/fastdfs0/data /home/xxl/fastdfs/storage/fastdfs0/data/M00
8. hiredis
hiredis 是 Redis 数据库的一个 C 客户端库。
<br/><br/>
十四. 数据库
1. mysql
一、安装
下载安装(这条命令会下载最新版)
sudo apt-get install -y mysql-server
sudo apt-get install -y mysql-client
MySQL 开发包
sudo apt-get install -y libmysqlclient-dev
启动服务
service mysql start # 或者 systemctl start mysql
查看初始密码:
cat /etc/mysql/debian.cnf
使用初始账号密码进行登录:
mysql -udebian-sys-maint -p
二、更改 root 用户密码
更改 root 用户的密码(同时修改加密方式为:mysql_native_password):
alter user "root"@localhost identified with mysql_native_password by "123";
或者:
use mysql;
update mysql.user set authentication_string=password('123') where user='root' and Host ='localhost';
update user set plugin="mysql_native_password";
flush privileges;
若不需要修改加密方式,使用以下命令:
alter user "root"@localhost identified by "123";
三、配置允许远程访问
修改用户权限
- root 用户授权,
*.*
表示所有数据库的所有表,前一个*表示数据库名,后一个*表示表名 'root'@'%'
表示被授权的用户
use mysql; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; UPDATE mysql.user SET host='%' WHERE user='root'; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123'; flush privileges;
- root 用户授权,
查看用户的 host 以及 plugin 信息
- host 设置为 % 意思是允许所有远程主机连接 MySQL
- 如果 authentication 为空说明该用户没有设置密码
use mysql; select user, host, plugin, authentication_string from user;
查看以下文件,将 bind-address 注释掉,这样就能允许远程主机访问 MySQL 了
/etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf /etc/mysql/mysql.cnf
开放端口
使用 firewall-cmd 命令开放端口(若没安装则安装
sudo apt install -y firewalld
):firewall-cmd --zone=public --add-port=3306/tcp --permanent
或者使用 iptables 命令
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT 如果出错则用这个:iptables -I INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
若还不行,配置文件 mysql.cnf
加上:
[mysqld]
default_authentication_plugin=mysql_native_password
远程访问命令
查看 Linux 主机的 IP 地址
ifconfig
## 十五. 或者
ip addr
连接命令
mysql -h 172.18.248.230 -P 3306 -u root -p123
连接成功
设置 MySQL 字符编码 utf-8,可以支持中文操作
show variables like "char%"; # 先查看 MySQL 默认的字符编码
set character_set_server=utf8;
修改表的字符编码
alter table user default character set utf8;
修改属性表字符编码
alter table user modify column name varchar(50) character set utf8;
1. Redis 6.0
安装
下载源码
wget https://download.redis.io/releases/redis-6.0.0.tar.gz
编译安装
- PREFIX 表示安装地址
sudo make && sudo make install PREFIX=/usr/local/src/redis/
创建软链接
sudo ln -s /usr/local/src/redis/bin/redis-cli /usr/bin/redis-cli
sudo ln -s /usr/local/src/redis/bin/redis-server /usr/bin/redis-server
创建配置文件
vim redis.conf
:## 把后台启动打开 daemonize yes ## 把 bind 注释掉,打开则表示只有指定的网段才能访问 ip #bind 127.0.0.1 -::1 ## 设置成 no 表示允许远程访问 protected-mode no # 密码 requirepass 123
启动 redis 服务:
redis-server /usr/local/src/redis/redis.conf
验证 redis 服务:
redis-cli auth 123 #密码验证
远程连接命令
redis-cli -h 172.28.131.101 -p 6379
设置开机自启动
编写
redisd
(通常都以d结尾表示是后台自启动服务)vim redisd
redisd
内容如下:REDISPORT=6379 EXEC=/usr/local/src/redis/bin/redis-server CLIEXEC=/usr/local/src/redis/bin/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid CONF="/usr/local/src/redis/redis.conf"
将
redisd
复制到/etc/init.d
cp redisd /etc/init.d
让
redisd
取得执行权限sudo chmod +x /etc/init.d/redisd
加载到系统自启动文件
sudo update-rc.d redisd defaults
开启
redisd
服务systemctl start redisd #或者使用service命令: service redisd start
查看
redisd
服务状态systemctl status redisd #或者使用service命令: service redisd status
显示
<font color="green">
activate</font>
,则说明启动成功。
Redis 的一些命令
2. MongoDB
Install MongoDB Community Edition on Ubuntu — MongoDB Manual
启动失败,原因是权限不够
sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chown mongodb:mongodb /tmp/mongodb-27017.sock
可查看 /etc/mongodb.conf
systemctl status mongod
db.createUser({user:"root", pwd:"123", roles:["userAdminAnyDatabase"]}) # 创建用户
db.auth("root", "123") # 登录验证
mongo 172.18.246.227/27017 -u root -p 123 # 远程连接
遇到依赖项的问题:
libssl1.1 (>=1.1.1) but 1.1.0g-2ubuntu4.1 is not installable
解决办法:
到这里下载Index of /ubuntu libssl1.1_1.1.1-1ubuntu2.1~18.04.20_amd64.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1-1ubuntu2.1~18.04.20_amd64.deb
安装
dpkg -i libssl1.1_1.1.1-1ubuntu2.1~18.04.20_amd64.deb
3. PostgreSQL
4. SQLite3
<br/><br/>
十六. 容器
1. docker
Install on Ubuntu | Docker Documentation