linux属性

# 查看linux版本
lsb_release -a

# 查看nvidia显卡
lspci | grep -i nvidia

# 换源
/etc/apt/sources.list

# 查看服务器配置
lscpu

# 查看硬盘编号
ls /dev/disk/by-id -al

用户权限

# 查看所有用户
cat /etc/passwd

# 查看用户组
cat /etc/group

# user添加到groupA用户组
usermod -aG groupA user

# 锁定newuser1
usermod -L newuser1

# 解除对newuser1的锁定
usermod -U newuser1

# 踢掉用户
pkill -kill -t tty

# 停用用户所有进程
pkill -u user

# 显示文件最后5行内容
tail -n 5 test.log

# 循环查看文件内容
tail -f test.log

# 查看特定行内容
sed -n 5p output.txt

# 添加用户
sudo adduser user1

# 删除用户
sudo userdel -r username

# 添加用户到sudo组
adduser username sudo

# 追加用户到sudo组
sudo  usermod -aG sudo username

# 将用户从sudo组删除,并添加到其他组
sudo usermod -G 用户组名  用户名

# 将用户从一个组中删除
gpasswd -d userName groupName

# 添加环境变量
export PATH="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:$PATH"

# 改变文件拥有者和群组
chown root: log2012.log
chown -R joseph:joseph dir

# 查看用户所在组
groups user1

# 查看用户信息
id user1

# 修改密码
sudo passwd user

# 查看用户在线情况
who

# 查看自己是哪个终端
who am i

# 单向发送消息
write root pts/20
Hello, World!
Ctrl+d #发送并退出

# 群发消息
wall "hello, world!"

# 添加软件权限
sudo chmod u+s `which ping`

# 更改文件夹权限
chmod 775 -R dir

系统操作

修改时间

date -R

#修改时间
date --set="2017-01-22 16:16:23"

关机

sudo shutdown now

日志

# 查看系统重启日志
last |grep reboot

# 查看系统日志
dmesg

# 自定义dmesg输出
dmesg |grep [keyword]

进程管理

# 查看进程
ps -ef |grep vsftpd

# 查看服务
service vsftpd

# list stystem opened files, 列出系统中打开的所有文件, 因为linux上一切都是文件
# 查看端口
lsof -i:80

# 查看端口占用
netstat -tunlp | grep 端口号

# 查看程序打开了那些文件
lsof -p 7876

# 查看进程占用端口
ps -ef | grep 进程名
netstat -nltp | grep  进程号

# 查看哪些服务占用
sudo lsof | grep nvidia

# 查看内存占用
free

# 以合理单位显示内存占用
free -h

# 查看硬盘读写io
iostat

# 查看单个进程内存cpu占用情况
top -p ppid

# top 以内存占用排名
top -o %MEM

# 查看特定用户的进程
top -u josep

# VIRT代表进程当前时刻有多少内存可以访问
# ES 意味驻留内存大小, 是当前进程真正占用物理内存的精确反映.

# 查看内存占用前10的进程
ps aux | sort -k4,4nr | head -n 10

# 查看系统日志
sudo cat syslog

# 停止gdm服务
sudo systemctl stop gdm3

# glances 进程监控
apt install glances
热键
a 自动排序
c 按CPU使用率排序
m 按内存占用排序
i 按io速率排序进程
n 显示网络流量统计


# fuser 报告进程使用的文件和网络套接字

# 列出使用/etc/filesystems文件的进程的进程号和用户登录名
fuser -u /etc/filesystems
# 查看那些程序使用tcp的80端口
fuser -v 80/tcp
# 杀死访问指定文件的所有进程
fuser -k 443/tcp
# 查看哪个用户哪个进程占用着此设备
fuser -m -v /dev/sdb1

标准输入输出

echo log > /dev/null 2>&1

代表空设备文件
/dev/null 
# 代表重定向到哪里,例如:echo "123" > /home/123.txt
>
# 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
1
# 表示stderr标准错误
2
# 表示等同于的意思,2>&1,表示2的输出重定向等同于1
&

系统设置

环境变量

vim .profile
export PATH=$PATH:/home/jeremie/Downloads/pycharm-community-2016.3.2/bin
source .profile

# 设置环境变量
export http_proxy="http://172.18.10.216:1080"

# 查看环境变量
echo $http_proxy

# 删除环境变量
unset http_proxy

字体配置

# /usr/share/fonts/下新建winFonts目录
sudo mkdir -p /usr/share/fonts/winFonts

# 然后将字体文件拷贝到此文件夹下
sudo cp ~/Desktop/font/*.ttf /usr/share/fonts/winFonts/

# 修改权限
sudo chmod 755 /usr/share/fonts/winFonts/*.ttf

# 生成核心字体信息
sudo mkfontscale
sudo mkfontdir
sudo fc-cache -fv

# matplotlib报错问题
sudo apt install msttcorefonts -qq
rm ~/.cache/matplotlib -rf

systemctl

# 立即启动一个服务
sudo systemctl start apache.service

# 立即停止一个服务
sudo systemctl stop apache.service

# 重启一个服务
sudo systemctl restart apache.service

# 查看服务状态
sudo systemctl status apache.service

系统休眠

# 查看是否开启自动休眠
sudo systemctl status sleep.target

# 关闭自动休眠
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

# 查看自动休眠是否关闭
systemctl status sleep.target

rc.local开机启动

# 开机启动
创建/etc/rc.local文件

# rc.local文件第一行添加
#!/bin/sh -e

# 确保/etc/rc.local可执行
sudo chown root /etc/rc.local
sudo chmod 755 /etc/rc.local

# 验证rc.local工作正常
sudo systemctl status rc.local.service

ubuntu apt 包管理

# list the installed software packages on your machine 
sudo apt list --installed | grep -i gnome

# 清理安装gnome时候留下的缓存程序软件包
apt-get clean

# 删除gnome的相关配置文件
apt-get purge gnome

# 卸载掉gnome
sudo apt-get remove gnome

# 使用代理安装
sudo apt-get -o Acquire::http::proxy="http://127.0.0.1:8118/" update

update-alternatives

# display 参数列出一个命令的所有可选命令
update-alternatives --display java

# config参数用于给某个命令选择一个link值
update-alternatives --config java

# install参数用于添加一个命令的link值,slave 创建的链接从属某一个主链接。
update-alternatives --install /usr/bin/java java /usr/local/java/jdk-9/bin/java 1702

# remove参数用于删除一个命令的link值,其附带的slave也将一起删除。
update-alternatives –remove java /usr/local/jre1.6.0_20/bin/java

添加虚拟内存

# 创建swap文件
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

库的软链接指令速查

# locate 定位库的信息  
locate libcurl.so.4  

# ls -l  查看链接  
ls -l /usr/local/lib/libcurl.so.4

# sudo rm -rf 删除软连接
sudo rm -rf /usr/lib/x86_64-linux-gnu/libcurl.so.4

# sudo ln -s 重建软连接
sudo ln -s /home/anaconda2/lib/libcurl.so.4.4.0 /home/anaconda2/lib/libcurl.so.4

# 文件夹软连接
ln -s /opt/linux/rootfs_dir  /home/jyg/rootfs_dir

# cmake --version 使用cmake时的链接库,如果有冲突则会报错。没有冲突,会输出版本信息
cmake --version

命令工具

grep

find . -name "*.php" | xargs grep

# 只输出文件中匹配到的部分 -o
grep -o 'matchcontent=[]'

# 取反
grep -v 'matchcontent'

# 查看当前目录文件名中含有nout4的文件
ls | grep nout4

# 从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 "thermcontact" 的行:
find . -name "*.in" | xargs grep "thermcontact"

# 查找当前目录中不含有algo_name文本的文本文件,并将文件名列出来
find . -name "arima*.json" -exec grep -lv "algo_name" /dev/null {} +

# 查找当前目录中不含有algo_name文本的文本文件,并将计算文件的个数
find . -name "arima*.json" -exec grep -lv "algo_name" /dev/null {} + | wc -l

sort & uniq

# 正排序
sort -n file

# 逆排序
sort -rn file

# 所有字符只显示一次
sort -nr file | uniq

# 所有字符显示一遍,并计算重复个数
sort -nr file | uniq -c

查看文件大小并排序

du -sh /usr/*  |sort -nr | head

统计每个文件的行数,并根据行数对文件进行排序

wc -l * | sort -n

查看开头是NN的文件名的行数,并根据每个文件的行数进行排序

wc -l NN* | sort -n

Find Linux Files by Name or Extension

find . -name "*.err"

finding out where a program is located

which firefox

xargs

# 使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉
# 将上一个程序的标准输出传给下一个程序的命令行
echo xx | xargs -I {} command {}

ls

# 列出所有文件名前缀是predict的文件
ls predict*

# 列出所有文件名前缀是predict的文件,并计算个数
ls predict* | wc -l

dd

dd if=<source file name> of=<target file name> [Options]

vsftpd

# /etc/vsftpd.conf

# 增加匿名访问目录
anon_root=/var/ftp

ftp

# connect ftp
ftp 192.168.4.25

# 匿名用户
anonymous 

# 下载文件
get file_name

修改文件名编码

apt-get install convmv

gbk->utf-8
convmv -f gbk -t UTF-8 --notest -r 目录
convmv -f gbk -t UTF-8 --notest 测试.txt

#-f 参数是指出转换前的编码;
#-t 是转换后的编码;
#-r 递归处理子文件夹;
#--notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验;

jpg转text

sudo apt install caca-utils
cacaview 1.jpg

pdf转text

apt-get install poppler-utils
pdftotext php-manual.pdf php-manual.txt

格式化json

apt install jq
cat json.txt | jq '.'

统计文件行数

# c 统计字节数 l 统计行数 w 统计字数
wc -clw file

查看文件

cat file.txt

# 查看前几行
head -n 10 file.txt

# 查看后几行
tail -n 10 file.txt

# 查看特定的行数
sed -n '1000,2000p' filename.csv

nohup

# nohup 确保这个进程在断开 ssh 连接后依旧运行,& 让进程在后台运行
nohup jupyter notebook 2>&1 &

# 后台文件写入log
command >& file.txt(或者file.log) &

使用图形界面打开文件

# 配置
# vim /etc/ssh/sshd_config
AllowTcpForwarding yes
X11Forwarding yes

# opens a file or URL in the user's preferred application
xdg-open $file

# 后台打开pycharm
./pycharm &

网络

networking

# 启动以太网卡
ifconfig eth0 up
sudo /etc/init.d/networking restart

# 网络重启
sudo /etc/init.d/networking restart
sudo systemctl restart NetworkManager.service

# 查看所有路由
route -n

# 查看网络地址
ip a

# 查看无线网络连接情况
iwconfig

# 查看以太网接口
lspci |grep -i 'eth'

# 去除IP地址
ifconfig eh0 0.0.0.0

# 添加ip
ip addr add 目的/网关 dev eth0

# 添加路由
sudo ip route add 目的ip/netmask via 192.168.1.1

# ping4次
ping -c 4 google.comsudo 

# 手动获取ip
sudo dhclient

# 修改查看本地路由表
route

# 添加一条路由信息
route add -net 10.10.10.0/24 gw 192.168.0.1

# 删除一条路由信息
route del -net 10.10.10.0/24 gw 192.168.0.1

# 添加默认网关
route add default gw 192.168.0.1

# 查看路由表
netstat -r

# 查看tcp链接
netstat -t

# 查看udp链接
netstat -u

# 查看对应进程信息
netstat -ltp

# 每隔5秒展示tcp监听信息
netstat -tl -c 5

# 展示网卡信息
netstat -i

# 统计TCP链接状态
netstat -nat | awk '{print  $6}' | sort | uniq -c | sort -n

curl

curl baidu.com

# curl 代理
curl -x http://172.18.10.204:8119 baidu.com

ufw

# 关闭ufw
sudo ufw disable

# 查看状态
sudo ufw status

tcpdump

# FILTERING BY SOURCE AND DESTINATION
tcpdump src 2.3.4.5
tcpdump dst 3.4.5.6

# FIND TRAFFIC BY IP
tcpdump host 1.2.3.4

# SHOW TRAFFIC RELATED TO A SPECIFIC PORT
tcpdump port 3389
tcpdump src port 1025

nc

# 将本地文件发送到远程服务器的80端口
nc 192.168.1.199 80 < data.txt

# 本地端口,将接收的数据重定向到本地文件
nc -l 8080 > data.txt

.bashrc 配置

alias vim='nvim'
alias ls='ls -ahG'

文件

文件挂载

#Type this command to list the devices that are accessible on the computer:
fdisk -l

#格式化ext4
sudo mkfs.ext4 /dev/sdb1

# 创建目录并挂载文件
mount /dev/cdrom /mnt/cdrom

# 取消挂载
umount /mnt/cdrom

# 查看UUID
sudo blkid

# 添加UUID到/etc/fstab 
# 添加到/etc/fstab 其中UUID后面跟sdb1的UUID 重启
UUID=63295b70-daec-4253-b659-821f51200be9 /home/data ext4 defaults,errors=remount-ro 0 1

文件管理

# 统计挂载磁盘的整体情况
df -h

# 查看当前目录每个文件夹的情况
du --max-depth=1 -h
du -sh *

# 查看硬盘情况
fdisk -l

# Size of a directory
du -sh /tmp

# Size of a file
du -h /tmp/xyz

# 查询设备类型和文件系统
blkid

解压压缩

#extract
tar -x
#if the tar file also compressed with .tar.gz or tgz extension
tar -z
tar -xvf file.tar
tar -zxvf data.tar.gz

#unzip
unzip file.zip -d destination_folder

# 打包
tar czvf FileName.tar DirName
zip -r FileName.zip DirName

# gz
gzip -dk file.gz

文件本地上传和下载

# 安装
sudo apt install lrzsz

# 上传
rz

# 下载
sz

# md5 校验
md5sum file

tree

#Tee command is used to store and view (both at the same time) the output of any other command.
ls | tee file

crontab

sudo vim /etc/crontab
#每隔两分钟执行一次脚本
2 *   * * * root   /usr/bin/python3.5 /home/edgar/auto.py > /home/edgar/auto.log
# 分 时 日 月 周 用户 命令
* * * * * user command
# 每分钟执行一次
* * * * * user command
# 每隔2小时执行一次
* */2 * * * user command (/表示频率)
# 每天8:30分执行一次
30 8 * * * user command
# 每小时的30和50分各执行一次
30,50 * * * * user command(,表示并列)
# 每个月的3号到6号的8:30执行一次
30 8 3-6 * * user command (-表示范围)
# 每个星期一的8:30执行一次
30 8 * * 1 user command (周的范围为0-7,0和7代表周日)

修改管道系统的管道缓冲区大小

# 查看管道系统的管道缓冲区大小
sysctl fs.pipe-max-size

# 增加管道系统的管道缓冲区大小
sudo sysctl -w fs.pipe-max-size=536870912

ss

# apt
apt-get install shadowsocks

#pip
pip install shadowsocks

# 服务启动
ssserver -c /etc/shadowsocks.json --log-file=/tmp/shadowsocks.log

# 本地启动
sslocal -c /home/mudao/shadowsocks.json

# 配置文件
{
"server":"::",  ##填写服务器外网ip地址,ip也可以写内网地址,只要能转发出来即可。
"server_port":8000,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"",
"timeout":300,
"method":"aes-256-cfb",
"fast_open":false
}

# 后台运行
nohup ssserver -c /etc/shadowsocks.json > /dev/null 2>&1 & 

Privoxy

# install
sudo apt install privoxy

# 修改配置文件 
vim /etc/privoxy/config
#listen-address 127.0.0.1:8118 #取消注释
listen-address 0.0.0.0:8118 #取消注释
forward-socks5t / 127.0.0.1:1080 #取消注释

# 启动privoxy
systemctl start privoxy

# 添加socks5代理
export ALL_PROXY=socks5://127.0.0.1:1080

# 配置/etc/profile 添加http代理
export http_proxy=http://127.0.0.1:8118
export https_proxy=http://127.0.0.1:8118
export ftp_proxy=http://127.0.0.1:8118

常用工具

翻译软件

# 安装
sudo apt-get install translate-shell

# 翻译为中文
trans :zh-CN test

# 查看语言代码
trans -T

文件同步

rsync -r source destination

# 多目录同步
rsync -r source1 source2 destination

# 同步元信息(比如修改时间、权限等)
rsync -a source destination

# 镜像副本(确保两目录完全相同)
rsync -av --delete source/ destination

# 排除文件
rsync -av --exclude='*.txt' source/ destination

# 指定必须同步文件
rsync -av --include="*.txt" --exclude='*' source/ destination

# 远程同步
rsync -av source/ username@remote_host:destination

SSH

# 安装ssh
sudo apt install openssh-server
# 查看ssh是否启动
sudo systemctl status ssh


# 本地端口转发

# 假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过host3,将host1连上host2。
# 本地端口:目标主机:目标主机端口
# 指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口
# ssh -L [收听接口:]收听端口:目标主机:目标端口 username@hostname
ssh -L 2121:host2:21 host3name@host3
ssh -NL 6067:47.101.193.148:6076 pi@172.18.10.204

# 远程端口转发

# host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,"本地端口转发"就不能用了。
# 既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。
# host3执行命令
ssh -R 2121:host2:21 host1
# R参数也是接受三个值,分别是"远程主机端口:目标主机:目标主机端口"。这条命令的意思,就是让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为"远程端口绑定"。

wol

# 检查网卡是否支持wol
ethtool eth0

# Supports Wake-on
d -- 禁用
p -- 物理活动唤醒
u -- 单播消息唤醒
m -- 多播(组播)消息唤醒
b -- 广播消息唤醒
a -- ARP 唤醒
g -- 特定数据包magic packet唤醒
s -- 设有密码的特定数据包magic packet唤醒

# Wake-on
g -- 网卡已开启远程唤醒功能
d -- 输入命令开启

# 开启远程唤醒
ethtool -s eth0 wol g

# 安装wakeonlan
sudo apt-get install wakeonlan

# 网络唤醒
wakeonlan xx:xx:xx:xx:xx:xx